Tcl Library Source Code

Check-in Differences
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Difference From cce4ddc36cca1845 To a9b2ee05e38e52f4

2014-06-11
22:41
RDE C runtime, killed a few compiler warnings. check-in: 3ea2dbb6c0 user: andreask tags: pt-work
22:20
Fixed two comment misspellings. check-in: cce4ddc36c user: andreask tags: pt-work
22:17
pt::peg::to::cparam - Fix bug in cparam generator, missing global initialization of the "comments" flag introduced by the fixes for ticket [da61329276]. check-in: a9bc5f4335 user: andreask tags: pt-work
2014-01-31
08:04
Updated embedded release documentation. check-in: 4f04f7e130 user: aku tags: tcllib-1-16-rc
07:43
Bumped overall version to 1.16, generated the release README. check-in: a9b2ee05e3 user: aku tags: tcllib-1-16-rc
07:39
Bumped versions of modified packages and missed so far. check-in: d62c5a4fed user: aku tags: tcllib-1-16-rc

Changes to README.releasemgr.
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
and anybody else interested in the task.

Basics
------

< Flesh this out >

	sak.tcl validate
	sak.tcl test run
	sak.tcl review
	sak.tcl readme
	sak.tcl localdoc
	sak.tcl release (change to include rpmspec+gentip55+yml)

< Tasks, and how to perform them >

  	 Making a release (candidate) branch.
	 Readying the release in the branch.
	 Make the release official, merging the branch back.

Uploading and releasing files
--------------------------------------------

(1) Create a proper fossil event for the release, via

      http://core.tcl.tk/tcllib/eventedit

    See existing events (*) for a template

    (Ad *) http://core.tcl.tk/tcllib/event/dac0ddcd2e990234143196b4dc438fe01e7b9817

(2) Update the following web locations

    (a) Home page:	http://core.tcl.tk/tcllib/home
    (b) Downloads:	http://core.tcl.tk/tcllib/wiki?name=Downloads 
    (c) Past Releases:	http://core.tcl.tk/tcllib/wiki?name=Past+Releases

    Admin access to the fossil repository required

    (d) http://www.tcl.tk/home/release.txt
    (e) http://www.tcl.tk/software/tcllib/*.tml

    ssh access to tcl.activestate.com
    aka        	  www.tcl.tk
    required.

    (f) http://wiki.tcl.tk/1246







|
<
<
<
<
<



<
<
<

|


<
|
<

<
|
<

<
|
<
<
<

<
|
<
<

<
<
<
|
<
19
20
21
22
23
24
25
26





27
28
29



30
31
32
33

34

35

36

37

38



39

40


41



42

and anybody else interested in the task.

Basics
------

< Flesh this out >

	sak.tcl






< Tasks, and how to perform them >





Uploading and releasing files to SourceForge
--------------------------------------------


The main form to upload files is



	https://frs.sourceforge.net/webupload



This is WebDAV.





The place to manage the releases the files are for is






	https://sourceforge.net/project/admin/editpackages.php?group_id=12883

Changes to embedded/man/files/modules/crc/sum.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'sum\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2002, Pat Thoyts <patthoyts@users\&.sourceforge\&.net>
'\"
.TH "sum" n 1\&.1\&.1 tcllib "Cyclic Redundancy Checks"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'sum\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2002, Pat Thoyts <patthoyts@users\&.sourceforge\&.net>
'\"
.TH "sum" n 1\&.1\&.0 tcllib "Cyclic Redundancy Checks"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
sum \- Calculate a sum(1) compatible checksum
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBsum  ?1\&.1\&.1?\fR
.sp
\fB::crc::sum\fR ?\fI-bsd\fR | \fI-sysv\fR? ?\fI-format fmt\fR? ?\fI-chunksize size\fR? [ \fI-filename file\fR | \fI-channel chan\fR | \fIstring\fR ]
.sp
.BE
.SH DESCRIPTION
.PP
This package provides a Tcl-only implementation of the sum(1) command







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
sum \- Calculate a sum(1) compatible checksum
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBsum  ?1\&.1\&.0?\fR
.sp
\fB::crc::sum\fR ?\fI-bsd\fR | \fI-sysv\fR? ?\fI-format fmt\fR? ?\fI-chunksize size\fR? [ \fI-filename file\fR | \fI-channel chan\fR | \fIstring\fR ]
.sp
.BE
.SH DESCRIPTION
.PP
This package provides a Tcl-only implementation of the sum(1) command
Changes to embedded/man/files/modules/debug/debug.n.
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
.SH DESCRIPTION
Debugging areas of interest are represented by 'tags' which have
independently settable levels of interest (an integer, higher is more
detailed)\&.
.SH API
.TP
\fBdebug\&.\fBtag\fR\fR \fImessage\fR ?\fIlevel\fR?
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 \fImessage\fR is provided as a Tcl script whose value is
\fBsubst\fRed in the caller's scope if and only if the current level of
interest for the \fItag\fR matches or exceeds the call's \fIlevel\fR
of detail\&.  This is useful, as one can place arbitrarily complex
narrative in code without unnecessarily evaluating it\&.
.sp







|







311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
.SH DESCRIPTION
Debugging areas of interest are represented by 'tags' which have
independently settable levels of interest (an integer, higher is more
detailed)\&.
.SH API
.TP
\fBdebug\&.\fBtag\fR\fR \fImessage\fR ?\fIlevel\fR?
For each known tag the package creates a command with this signatur
the user can then use to provide the debug narrative of the tag\&.
The narrative \fImessage\fR is provided as a Tcl script whose value is
\fBsubst\fRed in the caller's scope if and only if the current level of
interest for the \fItag\fR matches or exceeds the call's \fIlevel\fR
of detail\&.  This is useful, as one can place arbitrarily complex
narrative in code without unnecessarily evaluating it\&.
.sp
Changes to embedded/man/files/modules/dns/tcllib_ip.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Generated from file 'tcllib_ip\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2004, Pat Thoyts
'\" Copyright (c) 2005 Aamer Akhter <aakhter@cisco\&.com>
'\"
.TH "tcllib_ip" n 1\&.2\&.2 tcllib "Domain Name Service"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,





|







1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Generated from file 'tcllib_ip\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2004, Pat Thoyts
'\" Copyright (c) 2005 Aamer Akhter <aakhter@cisco\&.com>
'\"
.TH "tcllib_ip" n 1\&.2\&.1 tcllib "Domain Name Service"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
..
.BS
.SH NAME
tcllib_ip \- IPv4 and IPv6 address manipulation
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBip  ?1\&.2\&.2?\fR
.sp
\fB::ip::version\fR \fIaddress\fR
.sp
\fB::ip::is\fR \fIclass\fR \fIaddress\fR
.sp
\fB::ip::equal\fR \fIaddress\fR \fIaddress\fR
.sp







|







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
..
.BS
.SH NAME
tcllib_ip \- IPv4 and IPv6 address manipulation
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBip  ?1\&.2\&.1?\fR
.sp
\fB::ip::version\fR \fIaddress\fR
.sp
\fB::ip::is\fR \fIclass\fR \fIaddress\fR
.sp
\fB::ip::equal\fR \fIaddress\fR \fIaddress\fR
.sp
Changes to embedded/man/files/modules/doctools/doctools.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'doctools\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2003-2014 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "doctools" n 1\&.4\&.18 tcllib "Documentation tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,


|

|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'doctools\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2003-2013 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "doctools" n 1\&.4\&.16 tcllib "Documentation tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
doctools \- doctools - Processing documents
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBdoctools  ?1\&.4\&.18?\fR
.sp
\fB::doctools::new\fR \fIobjectName\fR ?\fIoption value\fR\&.\&.\&.?
.sp
\fB::doctools::help\fR
.sp
\fB::doctools::search\fR \fIpath\fR
.sp







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
doctools \- doctools - Processing documents
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBdoctools  ?1\&.4\&.16?\fR
.sp
\fB::doctools::new\fR \fIobjectName\fR ?\fIoption value\fR\&.\&.\&.?
.sp
\fB::doctools::help\fR
.sp
\fB::doctools::search\fR \fIpath\fR
.sp
697
698
699
700
701
702
703
704
705
706
doctools_intro, doctools_lang_cmdref, doctools_lang_intro, doctools_lang_syntax, doctools_plugin_apiref
.SH KEYWORDS
HTML, TMML, conversion, documentation, manpage, markup, nroff
.SH CATEGORY
Documentation tools
.SH COPYRIGHT
.nf
Copyright (c) 2003-2014 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>

.fi







|


697
698
699
700
701
702
703
704
705
706
doctools_intro, doctools_lang_cmdref, doctools_lang_intro, doctools_lang_syntax, doctools_plugin_apiref
.SH KEYWORDS
HTML, TMML, conversion, documentation, manpage, markup, nroff
.SH CATEGORY
Documentation tools
.SH COPYRIGHT
.nf
Copyright (c) 2003-2013 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>

.fi
Changes to embedded/man/files/modules/dtplite/pkg_dtplite.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'pkg_dtplite\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2004-2013 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "dtplite" n 1\&.2 tcllib "Documentation toolbox"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'pkg_dtplite\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2004-2013 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "dtplite" n 1\&.1 tcllib "Documentation toolbox"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
.de MT
.QW ""
..
.BS
.SH NAME
dtplite \- Lightweight DocTools Markup Processor
.SH SYNOPSIS
package require \fBdtplite  ?1\&.2?\fR
.sp
\fBdtplite\fR \fB-o\fR \fIoutput\fR ?options? \fIformat\fR \fIinputfile\fR
.sp
\fBdtplite\fR \fBvalidate\fR \fIinputfile\fR
.sp
\fBdtplite\fR \fB-o\fR \fIoutput\fR ?options? \fIformat\fR \fIinputdirectory\fR
.sp
\fBdtplite\fR \fB-merge\fR \fB-o\fR \fIoutput\fR ?options? \fIformat\fR \fIinputdirectory\fR







<
<







270
271
272
273
274
275
276


277
278
279
280
281
282
283
.de MT
.QW ""
..
.BS
.SH NAME
dtplite \- Lightweight DocTools Markup Processor
.SH SYNOPSIS


\fBdtplite\fR \fB-o\fR \fIoutput\fR ?options? \fIformat\fR \fIinputfile\fR
.sp
\fBdtplite\fR \fBvalidate\fR \fIinputfile\fR
.sp
\fBdtplite\fR \fB-o\fR \fIoutput\fR ?options? \fIformat\fR \fIinputdirectory\fR
.sp
\fBdtplite\fR \fB-merge\fR \fB-o\fR \fIoutput\fR ?options? \fIformat\fR \fIinputdirectory\fR
Changes to embedded/man/files/modules/ftp/ftp.n.
1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'ftp\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "ftp" n 2\&.4\&.13 tcllib "ftp client"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,



|







1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'ftp\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "ftp" n 2\&.4\&.11 tcllib "ftp client"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
ftp \- Client-side tcl implementation of the ftp protocol
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBftp  ?2\&.4\&.13?\fR
.sp
\fB::ftp::Open\fR \fIserver\fR \fIuser\fR \fIpasswd\fR ?\fIoptions\fR?
.sp
\fB::ftp::Close\fR \fIhandle\fR
.sp
\fB::ftp::Cd\fR \fIhandle\fR \fIdirectory\fR
.sp







|







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
ftp \- Client-side tcl implementation of the ftp protocol
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBftp  ?2\&.4\&.11?\fR
.sp
\fB::ftp::Open\fR \fIserver\fR \fIuser\fR \fIpasswd\fR ?\fIoptions\fR?
.sp
\fB::ftp::Close\fR \fIhandle\fR
.sp
\fB::ftp::Cd\fR \fIhandle\fR \fIdirectory\fR
.sp
Changes to embedded/man/files/modules/html/html.n.
1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'html\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "html" n 1\&.4\&.3 tcllib "HTML Generation"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,



|







1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'html\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "html" n 1\&.4 tcllib "HTML Generation"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
html \- Procedures to generate HTML structures
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBhtml  ?1\&.4\&.3?\fR
.sp
\fB::html::author\fR \fIauthor\fR
.sp
\fB::html::bodyTag\fR \fIargs\fR
.sp
\fB::html::cell\fR \fIparam value\fR ?\fItag\fR?
.sp







|







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
html \- Procedures to generate HTML structures
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBhtml  ?1\&.4?\fR
.sp
\fB::html::author\fR \fIauthor\fR
.sp
\fB::html::bodyTag\fR \fIargs\fR
.sp
\fB::html::cell\fR \fIparam value\fR ?\fItag\fR?
.sp
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
.sp
\fB::html::keywords\fR \fIargs\fR
.sp
\fB::html::mailto\fR \fIemail\fR ?\fIsubject\fR?
.sp
\fB::html::meta\fR \fIargs\fR
.sp
\fB::html::css\fR \fIhref\fR
.sp
\fB::html::css-clear\fR
.sp
\fB::html::js\fR \fIhref\fR
.sp
\fB::html::js-clear\fR
.sp
\fB::html::minorList\fR \fIlist\fR ?\fIordered\fR?
.sp
\fB::html::minorMenu\fR \fIlist\fR ?\fIsep\fR?
.sp
\fB::html::nl2br\fR \fIstring\fR
.sp
\fB::html::openTag\fR \fItag\fR ?\fIparam\fR?







<
<
<
<
<
<
<
<







341
342
343
344
345
346
347








348
349
350
351
352
353
354
.sp
\fB::html::keywords\fR \fIargs\fR
.sp
\fB::html::mailto\fR \fIemail\fR ?\fIsubject\fR?
.sp
\fB::html::meta\fR \fIargs\fR
.sp








\fB::html::minorList\fR \fIlist\fR ?\fIordered\fR?
.sp
\fB::html::minorMenu\fR \fIlist\fR ?\fIsep\fR?
.sp
\fB::html::nl2br\fR \fIstring\fR
.sp
\fB::html::openTag\fR \fItag\fR ?\fIparam\fR?
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
.sp
\fB::html::textInputRow\fR \fIlabel name value args\fR
.sp
\fB::html::varEmpty\fR \fIname\fR
.sp
\fB::html::while\fR \fItest body\fR
.sp
\fB::html::doctype\fR \fIid\fR
.sp
.BE
.SH DESCRIPTION
.PP
The package \fBhtml\fR provides commands that generate HTML\&.
These commands typically return an HTML string as their result\&. In
particular, they do not output their result to \fBstdout\fR\&.
.PP







<
<







387
388
389
390
391
392
393


394
395
396
397
398
399
400
.sp
\fB::html::textInputRow\fR \fIlabel name value args\fR
.sp
\fB::html::varEmpty\fR \fIname\fR
.sp
\fB::html::while\fR \fItest body\fR
.sp


.BE
.SH DESCRIPTION
.PP
The package \fBhtml\fR provides commands that generate HTML\&.
These commands typically return an HTML string as their result\&. In
particular, they do not output their result to \fBstdout\fR\&.
.PP
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
Generate a set of \fIcheckbox\fR form elements and associated labels\&.  The
\fIlist\fR should contain an alternating list of labels and values\&.
This uses \fB::html::checkbox\fR\&. All the \fIcheckbox\fR buttons share the
same \fIkey\fR for their name\&. The \fIsep\fR is text used to separate
the elements\&.
.TP
\fB::html::checkValue\fR \fIname\fR ?\fIvalue\fR?
Generate the "name=\fIname\fR value=\fIvalue\fR" for a \fIcheckbox\fR form
element\&.  If the CGI variable \fIname\fR has the value \fIvalue\fR,
then SELECTED is added to the return value\&. \fIvalue\fR defaults to
"1"\&.
.TP
\fB::html::closeTag\fR
Pop a tag off the stack created by \fB::html::openTag\fR and generate
the corresponding close tag (e\&.g\&., </body>)\&.







|







426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
Generate a set of \fIcheckbox\fR form elements and associated labels\&.  The
\fIlist\fR should contain an alternating list of labels and values\&.
This uses \fB::html::checkbox\fR\&. All the \fIcheckbox\fR buttons share the
same \fIkey\fR for their name\&. The \fIsep\fR is text used to separate
the elements\&.
.TP
\fB::html::checkValue\fR \fIname\fR ?\fIvalue\fR?
Generate the "name=\fIname\fR value=\fIvalue\fR for a \fIcheckbox\fR form
element\&.  If the CGI variable \fIname\fR has the value \fIvalue\fR,
then SELECTED is added to the return value\&. \fIvalue\fR defaults to
"1"\&.
.TP
\fB::html::closeTag\fR
Pop a tag off the stack created by \fB::html::openTag\fR and generate
the corresponding close tag (e\&.g\&., </body>)\&.
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
\fB::html::meta\fR \fIargs\fR
\fISide effect only\fR\&.  Call this before \fB::html::head\fR to
define a \fImeta\fR tag for the page\&.  The \fIargs\fR is a Tcl-style name,
value list that is used for the name= and value= parameters for the
\fImeta\fR tag\&.  The \fImeta\fR tag is included in the result of
\fB::html::head\fR\&.
.TP
\fB::html::css\fR \fIhref\fR
\fISide effect only\fR\&.  Call this before \fB::html::head\fR to
define a \fIlink\fR tag for a linked CSS document\&.  The \fIhref\fR
value is a HTTP URL to a CSS document\&. The \fIlink\fR tag is included
in the result of \fB::html::head\fR\&.
.sp
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\&.
.TP
\fB::html::css-clear\fR
\fISide effect only\fR\&.  Call this before \fB::html::head\fR to
clear all links to CSS documents\&.
.sp
Multiple calls of this command are allowed, doing nothing after the
first of a sequence with no intervening \fB::html::css\fR\&.
.TP
\fB::html::js\fR \fIhref\fR
\fISide effect only\fR\&.  Call this before \fB::html::head\fR to
define a \fIscript\fR tag for a linked JavaScript document\&.  The
\fIhref\fR is a HTTP URL to a JavaScript document\&. The \fIscript\fR
tag is included in the result of \fB::html::head\fR\&.
.sp
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\&.
.TP
\fB::html::js-clear\fR
\fISide effect only\fR\&.  Call this before \fB::html::head\fR to
clear all links to JavaScript documents\&.
.sp
Multiple calls of this command are allowed, doing nothing after the
first of a sequence with no intervening \fB::html::js\fR\&.
.TP
\fB::html::minorList\fR \fIlist\fR ?\fIordered\fR?
Generate an ordered or unordered list of links\&.  The \fIlist\fR is a
Tcl-style name, value list of labels and urls for the links\&.
\fIordered\fR is a boolean used to choose between an ordered or
unordered list\&. It defaults to \fBfalse\fR\&.
.TP
\fB::html::minorMenu\fR \fIlist\fR ?\fIsep\fR?







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







581
582
583
584
585
586
587


































588
589
590
591
592
593
594
\fB::html::meta\fR \fIargs\fR
\fISide effect only\fR\&.  Call this before \fB::html::head\fR to
define a \fImeta\fR tag for the page\&.  The \fIargs\fR is a Tcl-style name,
value list that is used for the name= and value= parameters for the
\fImeta\fR tag\&.  The \fImeta\fR tag is included in the result of
\fB::html::head\fR\&.
.TP


































\fB::html::minorList\fR \fIlist\fR ?\fIordered\fR?
Generate an ordered or unordered list of links\&.  The \fIlist\fR is a
Tcl-style name, value list of labels and urls for the links\&.
\fIordered\fR is a boolean used to choose between an ordered or
unordered list\&. It defaults to \fBfalse\fR\&.
.TP
\fB::html::minorMenu\fR \fIlist\fR ?\fIsep\fR?
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
\fB::html::radioSet\fR \fIkey sep list\fR
Generate a set of \fIinput\fR tags of type \fIradio\fR and an associated text
label\&.  All the radio buttons share the same \fIkey\fR for their name\&.
The \fIsep\fR is text used to separate the elements\&.  The \fIlist\fR
is a Tcl-style label, value list\&.
.TP
\fB::html::radioValue\fR \fIname value\fR
Generate the "name=\fIname\fR value=\fIvalue\fR" for a \fIradio\fR form
element\&.  If the CGI variable \fIname\fR has the value \fIvalue\fR,
then SELECTED is added to the return value\&.
.TP
\fB::html::refresh\fR \fIseconds url\fR
Set up a refresh \fImeta\fR tag\&. Call this before \fB::html::head\fR and the
HEAD section will contain a \fImeta\fR tag that causes the document to
refresh in \fIseconds\fR seconds\&.  The \fIurl\fR is optional\&.  If







|







629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
\fB::html::radioSet\fR \fIkey sep list\fR
Generate a set of \fIinput\fR tags of type \fIradio\fR and an associated text
label\&.  All the radio buttons share the same \fIkey\fR for their name\&.
The \fIsep\fR is text used to separate the elements\&.  The \fIlist\fR
is a Tcl-style label, value list\&.
.TP
\fB::html::radioValue\fR \fIname value\fR
Generate the "name=\fIname\fR value=\fIvalue\fR for a \fIradio\fR form
element\&.  If the CGI variable \fIname\fR has the value \fIvalue\fR,
then SELECTED is added to the return value\&.
.TP
\fB::html::refresh\fR \fIseconds url\fR
Set up a refresh \fImeta\fR tag\&. Call this before \fB::html::head\fR and the
HEAD section will contain a \fImeta\fR tag that causes the document to
refresh in \fIseconds\fR seconds\&.  The \fIurl\fR is optional\&.  If
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
empty string for its value\&.
.TP
\fB::html::while\fR \fItest body\fR
This procedure is similar to the built-in Tcl \fBwhile\fR control
structure\&.  Rather than evaluating the body, it returns the subst'ed
\fIbody\fR\&.  Each iteration of the loop causes another string to be
concatenated to the result value\&.
.TP
\fB::html::doctype\fR \fIid\fR
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:
.RS
.IP [1]
HTML32
.IP [2]
HTML40
.IP [3]
HTML40T
.IP [4]
HTML40F
.IP [5]
HTML401
.IP [6]
HTML401T
.IP [7]
HTML401F
.IP [8]
XHTML10S
.IP [9]
XHTML10T
.IP [10]
XHTML10F
.IP [11]
XHTML11
.IP [12]
XHTMLB
.RE
.PP
.SH "BUGS, IDEAS, FEEDBACK"
This document, and the package it describes, will undoubtedly contain
bugs and other problems\&.
Please report such in the category \fIhtml\fR of the
\fITcllib Trackers\fR [http://core\&.tcl\&.tk/tcllib/reportlist]\&.
Please also report any ideas for enhancements you may have for either







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







702
703
704
705
706
707
708
































709
710
711
712
713
714
715
empty string for its value\&.
.TP
\fB::html::while\fR \fItest body\fR
This procedure is similar to the built-in Tcl \fBwhile\fR control
structure\&.  Rather than evaluating the body, it returns the subst'ed
\fIbody\fR\&.  Each iteration of the loop causes another string to be
concatenated to the result value\&.
































.PP
.SH "BUGS, IDEAS, FEEDBACK"
This document, and the package it describes, will undoubtedly contain
bugs and other problems\&.
Please report such in the category \fIhtml\fR of the
\fITcllib Trackers\fR [http://core\&.tcl\&.tk/tcllib/reportlist]\&.
Please also report any ideas for enhancements you may have for either
Changes to embedded/man/files/modules/json/json_write.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'json_write\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009-2013 Andreas Kupries <andreas_kupries@sourceforge\&.net>
'\"
.TH "json::write" n 1\&.0\&.3 tcllib "JSON"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'json_write\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009-2013 Andreas Kupries <andreas_kupries@sourceforge\&.net>
'\"
.TH "json::write" n 1\&.0\&.2 tcllib "JSON"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
json::write \- JSON generation
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBjson::write  ?1\&.0\&.3?\fR
.sp
\fB::json::write\fR \fBindented\fR
.sp
\fB::json::write\fR \fBindented\fR \fIflag\fR
.sp
\fB::json::write\fR \fBaligned\fR
.sp







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
json::write \- JSON generation
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBjson::write  ?1\&.0\&.2?\fR
.sp
\fB::json::write\fR \fBindented\fR
.sp
\fB::json::write\fR \fBindented\fR \fIflag\fR
.sp
\fB::json::write\fR \fBaligned\fR
.sp
Changes to embedded/man/files/modules/math/math_geometry.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Generated from file 'math_geometry\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2001 by Ideogramic ApS and other parties
'\" Copyright (c) 2004 by Arjen Markus
'\" Copyright (c) 2010 by Andreas Kupries
'\" Copyright (c) 2010 by Kevin Kenny
'\"
.TH "math::geometry" n 1\&.1\&.3 tcllib "Tcl Math Library"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'\"
'\" Generated from file 'math_geometry\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2001 by Ideogramic ApS and other parties
'\" Copyright (c) 2004 by Arjen Markus
'\" Copyright (c) 2010 by Andreas Kupries
'\" Copyright (c) 2010 by Kevin Kenny
'\"
.TH "math::geometry" n 1\&.1\&.2 tcllib "Tcl Math Library"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
..
.BS
.SH NAME
math::geometry \- Geometrical computations
.SH SYNOPSIS
package require \fBTcl  ?8\&.3?\fR
.sp
package require \fBmath::geometry  ?1\&.1\&.3?\fR
.sp
\fB::math::geometry::+\fR \fIpoint1\fR \fIpoint2\fR
.sp
\fB::math::geometry::-\fR \fIpoint1\fR \fIpoint2\fR
.sp
\fB::math::geometry::p\fR \fIx\fR \fIy\fR
.sp







|







275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
..
.BS
.SH NAME
math::geometry \- Geometrical computations
.SH SYNOPSIS
package require \fBTcl  ?8\&.3?\fR
.sp
package require \fBmath::geometry  ?1\&.1\&.2?\fR
.sp
\fB::math::geometry::+\fR \fIpoint1\fR \fIpoint2\fR
.sp
\fB::math::geometry::-\fR \fIpoint1\fR \fIpoint2\fR
.sp
\fB::math::geometry::p\fR \fIx\fR \fIy\fR
.sp
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
.sp
\fB::math::geometry::calculateDistanceToLine\fR \fIP\fR \fIline\fR
.sp
\fB::math::geometry::calculateDistanceToLineSegment\fR \fIP\fR \fIlinesegment\fR
.sp
\fB::math::geometry::calculateDistanceToPolyline\fR \fIP\fR \fIpolyline\fR
.sp
\fB::math::geometry::calculateDistanceToPolygon\fR \fIP\fR \fIpolygon\fR
.sp
\fB::math::geometry::findClosestPointOnLine\fR \fIP\fR \fIline\fR
.sp
\fB::math::geometry::findClosestPointOnLineSegment\fR \fIP\fR \fIlinesegment\fR
.sp
\fB::math::geometry::findClosestPointOnPolyline\fR \fIP\fR \fIpolyline\fR
.sp
\fB::math::geometry::lengthOfPolyline\fR \fIpolyline\fR







<
<







311
312
313
314
315
316
317


318
319
320
321
322
323
324
.sp
\fB::math::geometry::calculateDistanceToLine\fR \fIP\fR \fIline\fR
.sp
\fB::math::geometry::calculateDistanceToLineSegment\fR \fIP\fR \fIlinesegment\fR
.sp
\fB::math::geometry::calculateDistanceToPolyline\fR \fIP\fR \fIpolyline\fR
.sp


\fB::math::geometry::findClosestPointOnLine\fR \fIP\fR \fIline\fR
.sp
\fB::math::geometry::findClosestPointOnLineSegment\fR \fIP\fR \fIlinesegment\fR
.sp
\fB::math::geometry::findClosestPointOnPolyline\fR \fIP\fR \fIpolyline\fR
.sp
\fB::math::geometry::lengthOfPolyline\fR \fIpolyline\fR
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
first and last points of the line segment
.RE
.sp
.sp
.TP
\fB::math::geometry::calculateDistanceToPolyline\fR \fIP\fR \fIpolyline\fR
Calculate the distance of point P to the polyline and
return the result\&. Note that a polyline needs not to be closed\&.
.RS
.TP
list \fIP\fR
List of two numbers, the coordinates of the point
.TP
list \fIpolyline\fR
List of numbers, the coordinates of the
vertices of the polyline
.RE
.sp
.TP
\fB::math::geometry::calculateDistanceToPolygon\fR \fIP\fR \fIpolygon\fR
Calculate the distance of point P to the polygon and
return the result\&. If the list of coordinates is not closed (first and last
points differ), it is automatically closed\&.
.RS
.TP
list \fIP\fR
List of two numbers, the coordinates of the point
.TP
list \fIpolygon\fR
List of numbers, the coordinates of the
vertices of the polygon
.RE
.sp
.TP
\fB::math::geometry::findClosestPointOnLine\fR \fIP\fR \fIline\fR
Return the point on a line which is closest to a given point\&.
.RS
.TP
list \fIP\fR







|









<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525















526
527
528
529
530
531
532
first and last points of the line segment
.RE
.sp
.sp
.TP
\fB::math::geometry::calculateDistanceToPolyline\fR \fIP\fR \fIpolyline\fR
Calculate the distance of point P to the polyline and
return the result\&.
.RS
.TP
list \fIP\fR
List of two numbers, the coordinates of the point
.TP
list \fIpolyline\fR
List of numbers, the coordinates of the
vertices of the polyline
.RE















.sp
.TP
\fB::math::geometry::findClosestPointOnLine\fR \fIP\fR \fIline\fR
Return the point on a line which is closest to a given point\&.
.RS
.TP
list \fIP\fR
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
list \fIdist\fR
Distance over which to move the point
.RE
.sp
.TP
\fB::math::geometry::lineSegmentsIntersect\fR \fIlinesegment1\fR \fIlinesegment2\fR
Check if two line segments intersect or coincide\&. Returns 1 if that is
the case, 0 otherwise (in two dimensions only)\&. If an endpoint of one segment lies on
the other segment (or is very close to the segment), they are considered to intersect
.RS
.TP
list \fIlinesegment1\fR
First line segment
.TP
list \fIlinesegment2\fR
Second line segment







|
<







590
591
592
593
594
595
596
597

598
599
600
601
602
603
604
list \fIdist\fR
Distance over which to move the point
.RE
.sp
.TP
\fB::math::geometry::lineSegmentsIntersect\fR \fIlinesegment1\fR \fIlinesegment2\fR
Check if two line segments intersect or coincide\&. Returns 1 if that is
the case, 0 otherwise (in two dimensions only)\&.

.RS
.TP
list \fIlinesegment1\fR
First line segment
.TP
list \fIlinesegment2\fR
Second line segment
Changes to embedded/man/files/modules/pt/pt_peg_from_peg.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'from\&.inc' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt::peg::from::peg" n 1\&.0\&.2 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'from\&.inc' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt::peg::from::peg" n 1 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt::peg::from::peg \- PEG Conversion\&. Read PEG format
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::peg::from::peg  ?1\&.0\&.2?\fR
.sp
\fBpt::peg::from::peg\fR \fBconvert\fR \fItext\fR
.sp
.BE
.SH DESCRIPTION
.PP
Are you lost ?







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt::peg::from::peg \- PEG Conversion\&. Read PEG format
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::peg::from::peg  ?1?\fR
.sp
\fBpt::peg::from::peg\fR \fBconvert\fR \fItext\fR
.sp
.BE
.SH DESCRIPTION
.PP
Are you lost ?
Changes to embedded/man/files/modules/pt/pt_peg_op.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'pt_peg_op\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt_peg_op" i 1\&.0\&.1 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'pt_peg_op\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt_peg_op" i 1 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt_peg_op \- Parser Tools PE Grammar Utility Operations
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::peg::op  1\&.0\&.1\fR
.sp
\fB::peg::peg::op\fR \fBcalled\fR \fIcontainer\fR
.sp
\fB::peg::peg::op\fR \fBdechain\fR \fIcontainer\fR
.sp
\fB::peg::peg::op\fR \fBdrop unreachable\fR \fIcontainer\fR
.sp







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt_peg_op \- Parser Tools PE Grammar Utility Operations
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::peg::op  1\fR
.sp
\fB::peg::peg::op\fR \fBcalled\fR \fIcontainer\fR
.sp
\fB::peg::peg::op\fR \fBdechain\fR \fIcontainer\fR
.sp
\fB::peg::peg::op\fR \fBdrop unreachable\fR \fIcontainer\fR
.sp
Changes to embedded/man/files/modules/pt/pt_peg_to_peg.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'to\&.inc' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt::peg::to::peg" n 1\&.0\&.1 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'to\&.inc' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt::peg::to::peg" n 1 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt::peg::to::peg \- PEG Conversion\&. Write PEG format
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::peg::to::peg  ?1\&.0\&.1?\fR
.sp
package require \fBpt::peg \fR
.sp
package require \fBpt::pe \fR
.sp
package require \fBtext::write \fR
.sp







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt::peg::to::peg \- PEG Conversion\&. Write PEG format
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::peg::to::peg  ?1?\fR
.sp
package require \fBpt::peg \fR
.sp
package require \fBpt::pe \fR
.sp
package require \fBtext::write \fR
.sp
Changes to embedded/man/files/modules/pt/pt_pgen.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'pt_pgen\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt::pgen" n 1\&.0\&.2 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'pt_pgen\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2009 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "pt::pgen" n 1\&.0\&.1 tcllib "Parser Tools"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt::pgen \- Parser Generator
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::pgen  ?1\&.0\&.2?\fR
.sp
\fB::pt::pgen\fR \fIinputformat\fR \fItext\fR \fIresultformat\fR ?\fIoptions\&.\&.\&.\fR?
.sp
.BE
.SH DESCRIPTION
.PP
Are you lost ?







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
pt::pgen \- Parser Generator
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBpt::pgen  ?1\&.0\&.1?\fR
.sp
\fB::pt::pgen\fR \fIinputformat\fR \fItext\fR \fIresultformat\fR ?\fIoptions\&.\&.\&.\fR?
.sp
.BE
.SH DESCRIPTION
.PP
Are you lost ?
Changes to embedded/man/files/modules/rest/rest.n.
1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'rest\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "rest" n 1\&.0\&.1 tcllib "A framework for RESTful web services"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,



|







1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'rest\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "rest" n 1\&.0 tcllib "A framework for RESTful web services"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
rest \- define REST web APIs and call them inline or asychronously
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBrest  ?1\&.0\&.1?\fR
.sp
\fB::rest::simple\fR \fIurl\fR \fIquery\fR ?config? ?body?
.sp
\fB::rest::get\fR \fIurl\fR \fIquery\fR ?config? ?body?
.sp
\fB::rest::post\fR \fIurl\fR \fIquery\fR ?config? ?body?
.sp







|







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
rest \- define REST web APIs and call them inline or asychronously
.SH SYNOPSIS
package require \fBTcl  8\&.5\fR
.sp
package require \fBrest  ?1\&.0?\fR
.sp
\fB::rest::simple\fR \fIurl\fR \fIquery\fR ?config? ?body?
.sp
\fB::rest::get\fR \fIurl\fR \fIquery\fR ?config? ?body?
.sp
\fB::rest::post\fR \fIurl\fR \fIquery\fR ?config? ?body?
.sp
Changes to embedded/man/files/modules/struct/struct_list.n.
1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Generated from file 'struct_list\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2003-2005 by Kevin B\&. Kenny\&. All rights reserved
'\" Copyright (c) 2003-2012 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "struct::list" n 1\&.8\&.3 tcllib "Tcl Data Structures"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,





|







1
2
3
4
5
6
7
8
9
10
11
12
13
'\"
'\" Generated from file 'struct_list\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2003-2005 by Kevin B\&. Kenny\&. All rights reserved
'\" Copyright (c) 2003-2012 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "struct::list" n 1\&.8\&.2 tcllib "Tcl Data Structures"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
..
.BS
.SH NAME
struct::list \- Procedures for manipulating lists
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBstruct::list  ?1\&.8\&.3?\fR
.sp
\fB::struct::list\fR \fBlongestCommonSubsequence\fR \fIsequence1\fR \fIsequence2\fR ?\fImaxOccurs\fR?
.sp
\fB::struct::list\fR \fBlongestCommonSubsequence2\fR \fIsequence1 sequence2\fR ?\fImaxOccurs\fR?
.sp
\fB::struct::list\fR \fBlcsInvert\fR \fIlcsData\fR \fIlen1\fR \fIlen2\fR
.sp







|







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
..
.BS
.SH NAME
struct::list \- Procedures for manipulating lists
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBstruct::list  ?1\&.8\&.2?\fR
.sp
\fB::struct::list\fR \fBlongestCommonSubsequence\fR \fIsequence1\fR \fIsequence2\fR ?\fImaxOccurs\fR?
.sp
\fB::struct::list\fR \fBlongestCommonSubsequence2\fR \fIsequence1 sequence2\fR ?\fImaxOccurs\fR?
.sp
\fB::struct::list\fR \fBlcsInvert\fR \fIlcsData\fR \fIlen1\fR \fIlen2\fR
.sp
Changes to embedded/man/files/modules/tar/tar.n.
1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'tar\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "tar" n 0\&.10 tcllib "Tar file handling"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,



|







1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'tar\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "tar" n 0\&.9 tcllib "Tar file handling"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
tar \- Tar file creation, extraction & manipulation
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBtar  ?0\&.10?\fR
.sp
\fB::tar::contents\fR \fItarball\fR ?\fB-chan\fR?
.sp
\fB::tar::stat\fR \fItarball\fR ?file? ?\fB-chan\fR?
.sp
\fB::tar::untar\fR \fItarball\fR \fIargs\fR
.sp







|







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
tar \- Tar file creation, extraction & manipulation
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBtar  ?0\&.9?\fR
.sp
\fB::tar::contents\fR \fItarball\fR ?\fB-chan\fR?
.sp
\fB::tar::stat\fR \fItarball\fR ?file? ?\fB-chan\fR?
.sp
\fB::tar::untar\fR \fItarball\fR \fIargs\fR
.sp
Changes to embedded/man/files/modules/term/ansi_cctrl.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'ansi_cctrl\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2006-2008 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "term::ansi::code::ctrl" n 0\&.2 tcllib "Terminal control"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'ansi_cctrl\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2006-2008 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "term::ansi::code::ctrl" n 0\&.1 tcllib "Terminal control"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
..
.BS
.SH NAME
term::ansi::code::ctrl \- ANSI control sequences
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBterm::ansi::code  ?0\&.2?\fR
.sp
package require \fBterm::ansi::code::ctrl  ?0\&.2?\fR
.sp
\fB::term::ansi::code::ctrl::names\fR
.sp
\fB::term::ansi::code::ctrl::import\fR ?\fIns\fR? ?\fIarg\fR\&.\&.\&.?
.sp
\fB::term::ansi::code::ctrl::eeol\fR
.sp







|

|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
..
.BS
.SH NAME
term::ansi::code::ctrl \- ANSI control sequences
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBterm::ansi::code  ?0\&.1?\fR
.sp
package require \fBterm::ansi::code::ctrl  ?0\&.1\&.1?\fR
.sp
\fB::term::ansi::code::ctrl::names\fR
.sp
\fB::term::ansi::code::ctrl::import\fR ?\fIns\fR? ?\fIarg\fR\&.\&.\&.?
.sp
\fB::term::ansi::code::ctrl::eeol\fR
.sp
Changes to embedded/man/files/modules/term/ansi_code.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'ansi_code\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2006 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "term::ansi::code" n 0\&.2 tcllib "Terminal control"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'ansi_code\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2006 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "term::ansi::code" n 0\&.1 tcllib "Terminal control"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
term::ansi::code \- Helper for control sequences
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBterm::ansi::code  ?0\&.2?\fR
.sp
\fB::term::ansi::code::esc\fR \fIstr\fR
.sp
\fB::term::ansi::code::escb\fR \fIstr\fR
.sp
\fB::term::ansi::code::define\fR \fIname\fR \fIescape\fR \fIcode\fR
.sp







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
term::ansi::code \- Helper for control sequences
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBterm::ansi::code  ?0\&.1?\fR
.sp
\fB::term::ansi::code::esc\fR \fIstr\fR
.sp
\fB::term::ansi::code::escb\fR \fIstr\fR
.sp
\fB::term::ansi::code::define\fR \fIname\fR \fIescape\fR \fIcode\fR
.sp
Changes to embedded/man/files/modules/term/ansi_send.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'ansi_send\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2006 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "term::ansi::send" n 0\&.2 tcllib "Terminal control"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,




|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'ansi_send\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2006 Andreas Kupries <andreas_kupries@users\&.sourceforge\&.net>
'\"
.TH "term::ansi::send" n 0\&.1 tcllib "Terminal control"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
term::ansi::send \- Output of ANSI control sequences to terminals
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBterm::ansi::send  ?0\&.2?\fR
.sp
\fB::term::ansi::send::import\fR ?\fIns\fR? \fI\&.\&.\&.\fR
.sp
\fB::term::ansi::send::eeol\fR
.sp
\fB::term::ansi::send::esol\fR
.sp







|







272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
..
.BS
.SH NAME
term::ansi::send \- Output of ANSI control sequences to terminals
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBterm::ansi::send  ?0\&.1?\fR
.sp
\fB::term::ansi::send::import\fR ?\fIns\fR? \fI\&.\&.\&.\fR
.sp
\fB::term::ansi::send::eeol\fR
.sp
\fB::term::ansi::send::esol\fR
.sp
Changes to embedded/man/files/modules/textutil/textutil.n.
1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'textutil\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "textutil" n 0\&.8 tcllib "Text and string utilities, macro processing"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,



|







1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'textutil\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "textutil" n 0\&.7\&.1 tcllib "Text and string utilities, macro processing"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
textutil \- Procedures to manipulate texts and strings\&.
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBtextutil  ?0\&.8?\fR
.sp
\fB::textutil::adjust\fR \fIstring args\fR
.sp
\fB::textutil::adjust::readPatterns\fR \fIfilename\fR
.sp
\fB::textutil::adjust::listPredefined\fR
.sp







|







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
..
.BS
.SH NAME
textutil \- Procedures to manipulate texts and strings\&.
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBtextutil  ?0\&.7\&.1?\fR
.sp
\fB::textutil::adjust\fR \fIstring args\fR
.sp
\fB::textutil::adjust::readPatterns\fR \fIfilename\fR
.sp
\fB::textutil::adjust::listPredefined\fR
.sp
Changes to embedded/man/files/modules/textutil/textutil_string.n.
1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'textutil_string\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "textutil::string" n 0\&.8 tcllib "Text and string utilities, macro processing"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,



|







1
2
3
4
5
6
7
8
9
10
11
'\"
'\" Generated from file 'textutil_string\&.man' by tcllib/doctools with format 'nroff'
'\"
.TH "textutil::string" n 0\&.7 tcllib "Text and string utilities, macro processing"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
..
.BS
.SH NAME
textutil::string \- Procedures to manipulate texts and strings\&.
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBtextutil::string  ?0\&.8?\fR
.sp
\fB::textutil::string::chop\fR \fIstring\fR
.sp
\fB::textutil::string::tail\fR \fIstring\fR
.sp
\fB::textutil::string::cap\fR \fIstring\fR
.sp
\fB::textutil::string::capEachWord\fR \fIstring\fR
.sp
\fB::textutil::string::uncap\fR \fIstring\fR
.sp
\fB::textutil::string::longestCommonPrefixList\fR \fIlist\fR
.sp
\fB::textutil::string::longestCommonPrefix\fR ?\fIstring\fR\&.\&.\&.?
.sp
.BE







|







<
<







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285


286
287
288
289
290
291
292
..
.BS
.SH NAME
textutil::string \- Procedures to manipulate texts and strings\&.
.SH SYNOPSIS
package require \fBTcl  8\&.2\fR
.sp
package require \fBtextutil::string  ?0\&.7?\fR
.sp
\fB::textutil::string::chop\fR \fIstring\fR
.sp
\fB::textutil::string::tail\fR \fIstring\fR
.sp
\fB::textutil::string::cap\fR \fIstring\fR
.sp


\fB::textutil::string::uncap\fR \fIstring\fR
.sp
\fB::textutil::string::longestCommonPrefixList\fR \fIlist\fR
.sp
\fB::textutil::string::longestCommonPrefix\fR ?\fIstring\fR\&.\&.\&.?
.sp
.BE
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
A convenience command\&. Removes the first character of \fIstring\fR and
returns the shortened string\&.
.TP
\fB::textutil::string::cap\fR \fIstring\fR
Capitalizes the first character of \fIstring\fR and returns the
modified string\&.
.TP
\fB::textutil::string::capEachWord\fR \fIstring\fR
Capitalizes the first character of word of the \fIstring\fR and
returns the modified string\&. Words quoted with either backslash or
dollar-sign are left untouched\&.
.TP
\fB::textutil::string::uncap\fR \fIstring\fR
The complementary operation to \fB::textutil::string::cap\fR\&. Forces
the first character of \fIstring\fR to lower case and returns the
modified string\&.
.TP
\fB::textutil::string::longestCommonPrefixList\fR \fIlist\fR
.TP







<
<
<
<
<







304
305
306
307
308
309
310





311
312
313
314
315
316
317
A convenience command\&. Removes the first character of \fIstring\fR and
returns the shortened string\&.
.TP
\fB::textutil::string::cap\fR \fIstring\fR
Capitalizes the first character of \fIstring\fR and returns the
modified string\&.
.TP





\fB::textutil::string::uncap\fR \fIstring\fR
The complementary operation to \fB::textutil::string::cap\fR\&. Forces
the first character of \fIstring\fR to lower case and returns the
modified string\&.
.TP
\fB::textutil::string::longestCommonPrefixList\fR \fIlist\fR
.TP
Changes to embedded/man/files/modules/zip/decode.n.
1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'decode\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2008-2014 Andreas Kupries
'\"
.TH "zipfile::decode" n 0\&.5 tcllib "Zip archive handling"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,


|

|







1
2
3
4
5
6
7
8
9
10
11
12
'\"
'\" Generated from file 'decode\&.man' by tcllib/doctools with format 'nroff'
'\" Copyright (c) 2008-2012 Andreas Kupries
'\"
.TH "zipfile::encode" n 0\&.3 tcllib "Zip archive handling"
.\" The -*- nroff -*- definitions below are for supplemental macros used
.\" in Tcl/Tk manual entries.
.\"
.\" .AP type name in/out ?indent?
.\"	Start paragraph describing an argument to a library procedure.
.\"	type is type of argument (int, etc.), in/out is either "in", "out",
.\"	or "in/out" to describe whether procedure reads or modifies arg,
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
..
.\"	# MT - "empty" string
.de MT
.QW ""
..
.BS
.SH NAME
zipfile::decode \- Access to zip archives
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBfileutil::magic::mimetype \fR
.sp
package require \fBfileutil::decode  0\&.2\fR
.sp
package require \fBTrf \fR
.sp
package require \fBzlibtcl \fR
.sp
package require \fBzipfile::decode  ?0\&.5?\fR
.sp
\fB::zipfile::decode::archive\fR
.sp
\fB::zipfile::decode::close\fR
.sp
\fB::zipfile::decode::comment\fR \fIadict\fR
.sp







|











|







268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
..
.\"	# MT - "empty" string
.de MT
.QW ""
..
.BS
.SH NAME
zipfile::encode \- Access to zip archives
.SH SYNOPSIS
package require \fBTcl  8\&.4\fR
.sp
package require \fBfileutil::magic::mimetype \fR
.sp
package require \fBfileutil::decode  0\&.2\fR
.sp
package require \fBTrf \fR
.sp
package require \fBzlibtcl \fR
.sp
package require \fBzipfile::decode  ?0\&.4?\fR
.sp
\fB::zipfile::decode::archive\fR
.sp
\fB::zipfile::decode::close\fR
.sp
\fB::zipfile::decode::comment\fR \fIadict\fR
.sp
392
393
394
395
396
397
398
399
400
401
package and/or documentation\&.
.SH KEYWORDS
decompression, zip
.SH CATEGORY
File
.SH COPYRIGHT
.nf
Copyright (c) 2008-2014 Andreas Kupries

.fi







|


392
393
394
395
396
397
398
399
400
401
package and/or documentation\&.
.SH KEYWORDS
decompression, zip
.SH CATEGORY
File
.SH COPYRIGHT
.nf
Copyright (c) 2008-2012 Andreas Kupries

.fi
Changes to embedded/man/index.n.
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
decompression
.RS
.TP
\fBfiles/modules/virtchannel_transform/tcllib_zlib\&.n\fR
tcl::transform::zlib
.TP
\fBfiles/modules/zip/decode\&.n\fR
zipfile::decode
.RE
decryption
.RS
.TP
\fBfiles/modules/virtchannel_transform/vt_otp\&.n\fR
tcl::transform::otp
.TP







|







2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
decompression
.RS
.TP
\fBfiles/modules/virtchannel_transform/tcllib_zlib\&.n\fR
tcl::transform::zlib
.TP
\fBfiles/modules/zip/decode\&.n\fR
zipfile::encode
.RE
decryption
.RS
.TP
\fBfiles/modules/virtchannel_transform/vt_otp\&.n\fR
tcl::transform::otp
.TP
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
.TP
\fBfiles/modules/virtchannel_base/tcllib_zero\&.n\fR
tcl::chan::zero
.RE
zip
.RS
.TP
\fBfiles/modules/zip/decode\&.n\fR
zipfile::decode
.TP
\fBfiles/modules/zip/encode\&.n\fR
zipfile::encode
.RE
zlib
.RS
.TP
\fBfiles/modules/virtchannel_transform/tcllib_zlib\&.n\fR
tcl::transform::zlib







|
|

|







11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
.TP
\fBfiles/modules/virtchannel_base/tcllib_zero\&.n\fR
tcl::chan::zero
.RE
zip
.RS
.TP
\fBfiles/modules/zip/encode\&.n\fR
zipfile::encode
.TP
\fBfiles/modules/zip/decode\&.n\fR
zipfile::encode
.RE
zlib
.RS
.TP
\fBfiles/modules/virtchannel_transform/tcllib_zlib\&.n\fR
tcl::transform::zlib
Changes to embedded/man/toc.n.
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
.TP
\fByaml\fR
\fIfiles/modules/yaml/yaml\&.n\fR: YAML Format Encoder/Decoder
.TP
\fByencode\fR
\fIfiles/modules/base64/yencode\&.n\fR: Y-encode/decode binary data
.TP
\fBzipfile::decode\fR
\fIfiles/modules/zip/decode\&.n\fR: Access to zip archives
.TP
\fBzipfile::encode\fR
\fIfiles/modules/zip/encode\&.n\fR: Generation of zip archives







|
|


|
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
.TP
\fByaml\fR
\fIfiles/modules/yaml/yaml\&.n\fR: YAML Format Encoder/Decoder
.TP
\fByencode\fR
\fIfiles/modules/base64/yencode\&.n\fR: Y-encode/decode binary data
.TP
\fBzipfile::encode\fR
\fIfiles/modules/zip/encode\&.n\fR: Generation of zip archives
.TP
\fBzipfile::encode\fR
\fIfiles/modules/zip/decode\&.n\fR: Access to zip archives
Changes to embedded/www/index.html.
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
<td class="#idxleft" width="35%"><a name="key334"> declare </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/term/ansi_code.html"> term::ansi::code </a>
</td></tr>
<tr class="#idxodd" valign=top>
<td class="#idxleft" width="35%"><a name="key43"> decompression </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_transform/tcllib_zlib.html"> tcl::transform::zlib </a> &#183; <a href="tcllib/files/modules/zip/decode.html"> zipfile::decode </a>
</td></tr>
<tr class="#idxeven" valign=top>
<td class="#idxleft" width="35%"><a name="key370"> decryption </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_transform/vt_otp.html"> tcl::transform::otp </a> &#183; <a href="tcllib/files/modules/virtchannel_transform/rot.html"> tcl::transform::rot </a>
</td></tr>
<tr class="#idxodd" valign=top>







|







944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
<td class="#idxleft" width="35%"><a name="key334"> declare </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/term/ansi_code.html"> term::ansi::code </a>
</td></tr>
<tr class="#idxodd" valign=top>
<td class="#idxleft" width="35%"><a name="key43"> decompression </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_transform/tcllib_zlib.html"> tcl::transform::zlib </a> &#183; <a href="tcllib/files/modules/zip/decode.html"> zipfile::encode </a>
</td></tr>
<tr class="#idxeven" valign=top>
<td class="#idxleft" width="35%"><a name="key370"> decryption </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_transform/vt_otp.html"> tcl::transform::otp </a> &#183; <a href="tcllib/files/modules/virtchannel_transform/rot.html"> tcl::transform::rot </a>
</td></tr>
<tr class="#idxodd" valign=top>
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
<td class="#idxleft" width="35%"><a name="key113"> zero </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_base/nullzero.html"> tcl::chan::nullzero </a> &#183; <a href="tcllib/files/modules/virtchannel_base/tcllib_zero.html"> tcl::chan::zero </a>
</td></tr>
<tr class="#idxeven" valign=top>
<td class="#idxleft" width="35%"><a name="key42"> zip </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/zip/decode.html"> zipfile::decode </a> &#183; <a href="tcllib/files/modules/zip/encode.html"> zipfile::encode </a>
</td></tr>
<tr class="#idxodd" valign=top>
<td class="#idxleft" width="35%"><a name="key541"> zlib </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_transform/tcllib_zlib.html"> tcl::transform::zlib </a>
</td></tr>
<tr class="#idxeven" valign=top>
<td class="#idxleft" width="35%"><a name="key196"> zoom </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/map/map_slippy.html"> map::slippy </a> &#183; <a href="tcllib/files/modules/map/map_slippy_cache.html"> map::slippy::cache </a> &#183; <a href="tcllib/files/modules/map/map_slippy_fetcher.html"> map::slippy::fetcher </a>
</td></tr>
</table>
</body></html>







|













4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
<td class="#idxleft" width="35%"><a name="key113"> zero </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_base/nullzero.html"> tcl::chan::nullzero </a> &#183; <a href="tcllib/files/modules/virtchannel_base/tcllib_zero.html"> tcl::chan::zero </a>
</td></tr>
<tr class="#idxeven" valign=top>
<td class="#idxleft" width="35%"><a name="key42"> zip </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/zip/decode.html"> zipfile::encode </a> &#183; <a href="tcllib/files/modules/zip/encode.html"> zipfile::encode </a>
</td></tr>
<tr class="#idxodd" valign=top>
<td class="#idxleft" width="35%"><a name="key541"> zlib </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/virtchannel_transform/tcllib_zlib.html"> tcl::transform::zlib </a>
</td></tr>
<tr class="#idxeven" valign=top>
<td class="#idxleft" width="35%"><a name="key196"> zoom </a></td>
<td class="#idxright" width="65%">
<a href="tcllib/files/modules/map/map_slippy.html"> map::slippy </a> &#183; <a href="tcllib/files/modules/map/map_slippy_cache.html"> map::slippy::cache </a> &#183; <a href="tcllib/files/modules/map/map_slippy_fetcher.html"> map::slippy::fetcher </a>
</td></tr>
</table>
</body></html>
Changes to embedded/www/tcllib/files/modules/crc/sum.html.
1
2
3
4
5
6
7
8

<html><head>
<title>sum - Cyclic Redundancy Checks</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
<








1
2
3
4
5
6
7

<html><head>
<title>sum - Cyclic Redundancy Checks</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">sum(n) 1.1.1 tcllib &quot;Cyclic Redundancy Checks&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>sum - Calculate a sum(1) compatible checksum</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">sum(n) 1.1.0 tcllib &quot;Cyclic Redundancy Checks&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>sum - Calculate a sum(1) compatible checksum</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">sum <span class="opt">?1.1.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::crc::sum</b> <span class="opt">?<i class="arg">-bsd</i> | <i class="arg">-sysv</i>?</span> <span class="opt">?<i class="arg">-format fmt</i>?</span> <span class="opt">?<i class="arg">-chunksize size</i>?</span> [ <i class="arg">-filename file</i> | <i class="arg">-channel chan</i> | <i class="arg">string</i> ]</a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>







|







127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">sum <span class="opt">?1.1.0?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::crc::sum</b> <span class="opt">?<i class="arg">-bsd</i> | <i class="arg">-sysv</i>?</span> <span class="opt">?<i class="arg">-format fmt</i>?</span> <span class="opt">?<i class="arg">-chunksize size</i>?</span> [ <i class="arg">-filename file</i> | <i class="arg">-channel chan</i> | <i class="arg">string</i> ]</a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
Changes to embedded/www/tcllib/files/modules/debug/debug.html.
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<p>Debugging areas of interest are represented by 'tags' which have
independently settable levels of interest (an integer, higher is more
detailed).</p>
</div>
<div id="section2" class="section"><h2><a name="section2">API</a></h2>
<dl class="definitions">
<dt><a name="1"><b class="cmd">debug.<b class="variable">tag</b></b> <i class="arg">message</i> <span class="opt">?<i class="arg">level</i>?</span></a></dt>
<dd><p>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 <i class="arg">message</i> is provided as a Tcl script whose value is
<b class="cmd"><a href="../../../../index.html#key269">subst</a></b>ed in the caller's scope if and only if the current level of
interest for the <i class="arg">tag</i> matches or exceeds the call's <i class="arg">level</i>
of detail.  This is useful, as one can place arbitrarily complex
narrative in code without unnecessarily evaluating it.</p>
<p>See methods <b class="method">level</b> and <b class="method">setting</b> for querying







|







152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<p>Debugging areas of interest are represented by 'tags' which have
independently settable levels of interest (an integer, higher is more
detailed).</p>
</div>
<div id="section2" class="section"><h2><a name="section2">API</a></h2>
<dl class="definitions">
<dt><a name="1"><b class="cmd">debug.<b class="variable">tag</b></b> <i class="arg">message</i> <span class="opt">?<i class="arg">level</i>?</span></a></dt>
<dd><p>For each known tag the package creates a command with this signatur
the user can then use to provide the debug narrative of the tag.
The narrative <i class="arg">message</i> is provided as a Tcl script whose value is
<b class="cmd"><a href="../../../../index.html#key269">subst</a></b>ed in the caller's scope if and only if the current level of
interest for the <i class="arg">tag</i> matches or exceeds the call's <i class="arg">level</i>
of detail.  This is useful, as one can place arbitrarily complex
narrative in code without unnecessarily evaluating it.</p>
<p>See methods <b class="method">level</b> and <b class="method">setting</b> for querying
Changes to embedded/www/tcllib/files/modules/dns/tcllib_ip.html.
1
2
3
4
5
6
7
8

<html><head>
<title>tcllib_ip - Domain Name Service</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
<








1
2
3
4
5
6
7

<html><head>
<title>tcllib_ip - Domain Name Service</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">tcllib_ip(n) 1.2.2 tcllib &quot;Domain Name Service&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>tcllib_ip - IPv4 and IPv6 address manipulation</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">tcllib_ip(n) 1.2.1 tcllib &quot;Domain Name Service&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>tcllib_ip - IPv4 and IPv6 address manipulation</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">ip <span class="opt">?1.2.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::ip::version</b> <i class="arg">address</i></a></li>
<li><a href="#2"><b class="cmd">::ip::is</b> <i class="arg">class</i> <i class="arg">address</i></a></li>
<li><a href="#3"><b class="cmd">::ip::equal</b> <i class="arg">address</i> <i class="arg">address</i></a></li>
<li><a href="#4"><b class="cmd">::ip::normalize</b> <i class="arg">address</i></a></li>
<li><a href="#5"><b class="cmd">::ip::contract</b> <i class="arg">address</i></a></li>







|







127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">ip <span class="opt">?1.2.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::ip::version</b> <i class="arg">address</i></a></li>
<li><a href="#2"><b class="cmd">::ip::is</b> <i class="arg">class</i> <i class="arg">address</i></a></li>
<li><a href="#3"><b class="cmd">::ip::equal</b> <i class="arg">address</i> <i class="arg">address</i></a></li>
<li><a href="#4"><b class="cmd">::ip::normalize</b> <i class="arg">address</i></a></li>
<li><a href="#5"><b class="cmd">::ip::contract</b> <i class="arg">address</i></a></li>
Changes to embedded/www/tcllib/files/modules/doctools/doctools.html.
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
	margin-bottom: 	1em;
	border-bottom:	1px solid black;
    }
--></style>
</head>
<! -- Generated from file 'doctools.man' by tcllib/doctools with format 'html'
   -->
<! -- Copyright &copy; 2003-2014 Andreas Kupries &lt;[email protected]&gt;
   -->
<! -- CVS: $Id$ doctools.n
   -->
<body><div class="doctools">
<hr> [
   <a href="../../../../../../../../home">Tcllib Home</a>
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">doctools(n) 1.4.18 tcllib &quot;Documentation tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>doctools - doctools - Processing documents</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|













|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
	margin-bottom: 	1em;
	border-bottom:	1px solid black;
    }
--></style>
</head>
<! -- Generated from file 'doctools.man' by tcllib/doctools with format 'html'
   -->
<! -- Copyright &copy; 2003-2013 Andreas Kupries &lt;[email protected]&gt;
   -->
<! -- CVS: $Id$ doctools.n
   -->
<body><div class="doctools">
<hr> [
   <a href="../../../../../../../../home">Tcllib Home</a>
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">doctools(n) 1.4.16 tcllib &quot;Documentation tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>doctools - doctools - Processing documents</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">doctools <span class="opt">?1.4.18?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::doctools::new</b> <i class="arg">objectName</i> <span class="opt">?<i class="arg">option value</i>...?</span></a></li>
<li><a href="#2"><b class="cmd">::doctools::help</b></a></li>
<li><a href="#3"><b class="cmd">::doctools::search</b> <i class="arg">path</i></a></li>
<li><a href="#4"><b class="cmd">objectName</b> <b class="method">method</b> <span class="opt">?<i class="arg">arg arg ...</i>?</span></a></li>
<li><a href="#5"><i class="arg">objectName</i> <b class="method">configure</b></a></li>







|







134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">doctools <span class="opt">?1.4.16?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::doctools::new</b> <i class="arg">objectName</i> <span class="opt">?<i class="arg">option value</i>...?</span></a></li>
<li><a href="#2"><b class="cmd">::doctools::help</b></a></li>
<li><a href="#3"><b class="cmd">::doctools::search</b> <i class="arg">path</i></a></li>
<li><a href="#4"><b class="cmd">objectName</b> <b class="method">method</b> <span class="opt">?<i class="arg">arg arg ...</i>?</span></a></li>
<li><a href="#5"><i class="arg">objectName</i> <b class="method">configure</b></a></li>
495
496
497
498
499
500
501
502
503
504
<div id="keywords" class="section"><h2><a name="keywords">Keywords</a></h2>
<p><a href="../../../../index.html#key18">HTML</a>, <a href="../../../../index.html#key19">TMML</a>, <a href="../../../../index.html#key20">conversion</a>, <a href="../../../../index.html#key185">documentation</a>, <a href="../../../../index.html#key17">manpage</a>, <a href="../../../../index.html#key16">markup</a>, <a href="../../../../index.html#key21">nroff</a></p>
</div>
<div id="category" class="section"><h2><a name="category">Category</a></h2>
<p>Documentation tools</p>
</div>
<div id="copyright" class="section"><h2><a name="copyright">Copyright</a></h2>
<p>Copyright &copy; 2003-2014 Andreas Kupries &lt;[email protected]&gt;</p>
</div>
</div></body></html>







|


495
496
497
498
499
500
501
502
503
504
<div id="keywords" class="section"><h2><a name="keywords">Keywords</a></h2>
<p><a href="../../../../index.html#key18">HTML</a>, <a href="../../../../index.html#key19">TMML</a>, <a href="../../../../index.html#key20">conversion</a>, <a href="../../../../index.html#key185">documentation</a>, <a href="../../../../index.html#key17">manpage</a>, <a href="../../../../index.html#key16">markup</a>, <a href="../../../../index.html#key21">nroff</a></p>
</div>
<div id="category" class="section"><h2><a name="category">Category</a></h2>
<p>Documentation tools</p>
</div>
<div id="copyright" class="section"><h2><a name="copyright">Copyright</a></h2>
<p>Copyright &copy; 2003-2013 Andreas Kupries &lt;[email protected]&gt;</p>
</div>
</div></body></html>
Changes to embedded/www/tcllib/files/modules/dtplite/pkg_dtplite.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">dtplite(n) 1.2 tcllib &quot;Documentation toolbox&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>dtplite - Lightweight DocTools Markup Processor</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">dtplite(n) 1.1 tcllib &quot;Documentation toolbox&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>dtplite - Lightweight DocTools Markup Processor</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">dtplite <span class="opt">?1.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">dtplite</b> <b class="option">-o</b> <i class="arg">output</i> <span class="opt">?options?</span> <i class="arg">format</i> <i class="arg">inputfile</i></a></li>
<li><a href="#2"><b class="cmd">dtplite</b> <b class="const">validate</b> <i class="arg">inputfile</i></a></li>
<li><a href="#3"><b class="cmd">dtplite</b> <b class="option">-o</b> <i class="arg">output</i> <span class="opt">?options?</span> <i class="arg">format</i> <i class="arg">inputdirectory</i></a></li>
<li><a href="#4"><b class="cmd">dtplite</b> <b class="option">-merge</b> <b class="option">-o</b> <i class="arg">output</i> <span class="opt">?options?</span> <i class="arg">format</i> <i class="arg">inputdirectory</i></a></li>
</ul>
</div>







<
<
<







130
131
132
133
134
135
136



137
138
139
140
141
142
143
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">



<ul class="syntax">
<li><a href="#1"><b class="cmd">dtplite</b> <b class="option">-o</b> <i class="arg">output</i> <span class="opt">?options?</span> <i class="arg">format</i> <i class="arg">inputfile</i></a></li>
<li><a href="#2"><b class="cmd">dtplite</b> <b class="const">validate</b> <i class="arg">inputfile</i></a></li>
<li><a href="#3"><b class="cmd">dtplite</b> <b class="option">-o</b> <i class="arg">output</i> <span class="opt">?options?</span> <i class="arg">format</i> <i class="arg">inputdirectory</i></a></li>
<li><a href="#4"><b class="cmd">dtplite</b> <b class="option">-merge</b> <b class="option">-o</b> <i class="arg">output</i> <span class="opt">?options?</span> <i class="arg">format</i> <i class="arg">inputdirectory</i></a></li>
</ul>
</div>
Changes to embedded/www/tcllib/files/modules/ftp/ftp.html.
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">ftp(n) 2.4.13 tcllib &quot;ftp client&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>ftp - Client-side tcl implementation of the ftp protocol</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
<li class="section"><a href="#section3">BUGS</a></li>
<li class="section"><a href="#section4">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">ftp <span class="opt">?2.4.13?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::ftp::Open</b> <i class="arg">server</i> <i class="arg">user</i> <i class="arg">passwd</i> <span class="opt">?<i class="arg">options</i>?</span></a></li>
<li><a href="#2"><b class="cmd">::ftp::Close</b> <i class="arg">handle</i></a></li>
<li><a href="#3"><b class="cmd">::ftp::Cd</b> <i class="arg">handle</i> <i class="arg">directory</i></a></li>
<li><a href="#4"><b class="cmd">::ftp::Pwd</b> <i class="arg">handle</i></a></li>
<li><a href="#5"><b class="cmd">::ftp::Type</b> <i class="arg">handle</i> <span class="opt">?<b class="const">ascii|binary|tenex</b>?</span></a></li>







|




















|







102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">ftp(n) 2.4.11 tcllib &quot;ftp client&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>ftp - Client-side tcl implementation of the ftp protocol</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
<li class="section"><a href="#section3">BUGS</a></li>
<li class="section"><a href="#section4">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">ftp <span class="opt">?2.4.11?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::ftp::Open</b> <i class="arg">server</i> <i class="arg">user</i> <i class="arg">passwd</i> <span class="opt">?<i class="arg">options</i>?</span></a></li>
<li><a href="#2"><b class="cmd">::ftp::Close</b> <i class="arg">handle</i></a></li>
<li><a href="#3"><b class="cmd">::ftp::Cd</b> <i class="arg">handle</i> <i class="arg">directory</i></a></li>
<li><a href="#4"><b class="cmd">::ftp::Pwd</b> <i class="arg">handle</i></a></li>
<li><a href="#5"><b class="cmd">::ftp::Type</b> <i class="arg">handle</i> <span class="opt">?<b class="const">ascii|binary|tenex</b>?</span></a></li>
Changes to embedded/www/tcllib/files/modules/html/html.html.
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">html(n) 1.4.3 tcllib &quot;HTML Generation&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>html - Procedures to generate HTML structures</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">html <span class="opt">?1.4.3?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::html::author</b> <i class="arg">author</i></a></li>
<li><a href="#2"><b class="cmd">::html::bodyTag</b> <i class="arg">args</i></a></li>
<li><a href="#3"><b class="cmd">::html::cell</b> <i class="arg">param value</i> <span class="opt">?<i class="arg">tag</i>?</span></a></li>
<li><a href="#4"><b class="cmd">::html::checkbox</b> <i class="arg">name value</i></a></li>
<li><a href="#5"><b class="cmd">::html::checkSet</b> <i class="arg">key sep list</i></a></li>







|


















|







102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">html(n) 1.4 tcllib &quot;HTML Generation&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>html - Procedures to generate HTML structures</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">html <span class="opt">?1.4?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::html::author</b> <i class="arg">author</i></a></li>
<li><a href="#2"><b class="cmd">::html::bodyTag</b> <i class="arg">args</i></a></li>
<li><a href="#3"><b class="cmd">::html::cell</b> <i class="arg">param value</i> <span class="opt">?<i class="arg">tag</i>?</span></a></li>
<li><a href="#4"><b class="cmd">::html::checkbox</b> <i class="arg">name value</i></a></li>
<li><a href="#5"><b class="cmd">::html::checkSet</b> <i class="arg">key sep list</i></a></li>
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<li><a href="#28"><b class="cmd">::html::headTag</b> <i class="arg">string</i></a></li>
<li><a href="#29"><b class="cmd">::html::html_entities</b> <i class="arg">string</i></a></li>
<li><a href="#30"><b class="cmd">::html::if</b> <i class="arg">expr1 body1</i> <span class="opt">?<b class="const">elseif</b> <i class="arg">expr2 body2 ...</i>?</span> <span class="opt">?<b class="const">else</b> <i class="arg">bodyN</i>?</span></a></li>
<li><a href="#31"><b class="cmd">::html::init</b> <span class="opt">?<i class="arg">list</i>?</span></a></li>
<li><a href="#32"><b class="cmd">::html::keywords</b> <i class="arg">args</i></a></li>
<li><a href="#33"><b class="cmd">::html::mailto</b> <i class="arg">email</i> <span class="opt">?<i class="arg">subject</i>?</span></a></li>
<li><a href="#34"><b class="cmd">::html::meta</b> <i class="arg">args</i></a></li>
<li><a href="#35"><b class="cmd">::html::css</b> <i class="arg">href</i></a></li>
<li><a href="#36"><b class="cmd">::html::css-clear</b></a></li>
<li><a href="#37"><b class="cmd">::html::js</b> <i class="arg">href</i></a></li>
<li><a href="#38"><b class="cmd">::html::js-clear</b></a></li>
<li><a href="#39"><b class="cmd">::html::minorList</b> <i class="arg">list</i> <span class="opt">?<i class="arg">ordered</i>?</span></a></li>
<li><a href="#40"><b class="cmd">::html::minorMenu</b> <i class="arg">list</i> <span class="opt">?<i class="arg">sep</i>?</span></a></li>
<li><a href="#41"><b class="cmd">::html::nl2br</b> <i class="arg">string</i></a></li>
<li><a href="#42"><b class="cmd">::html::openTag</b> <i class="arg">tag</i> <span class="opt">?<i class="arg">param</i>?</span></a></li>
<li><a href="#43"><b class="cmd">::html::paramRow</b> <i class="arg">list</i> <span class="opt">?<i class="arg">rparam</i>?</span> <span class="opt">?<i class="arg">cparam</i>?</span></a></li>
<li><a href="#44"><b class="cmd">::html::passwordInput</b> <span class="opt">?<i class="arg">name</i>?</span></a></li>
<li><a href="#45"><b class="cmd">::html::passwordInputRow</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></li>
<li><a href="#46"><b class="cmd">::html::quoteFormValue</b> <i class="arg">value</i></a></li>
<li><a href="#47"><b class="cmd">::html::radioSet</b> <i class="arg">key sep list</i></a></li>
<li><a href="#48"><b class="cmd">::html::radioValue</b> <i class="arg">name value</i></a></li>
<li><a href="#49"><b class="cmd">::html::refresh</b> <i class="arg">seconds url</i></a></li>
<li><a href="#50"><b class="cmd">::html::row</b> <i class="arg">args</i></a></li>
<li><a href="#51"><b class="cmd">::html::select</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></li>
<li><a href="#52"><b class="cmd">::html::selectPlain</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></li>
<li><a href="#53"><b class="cmd">::html::set</b> <i class="arg">var val</i></a></li>
<li><a href="#54"><b class="cmd">::html::submit</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></li>
<li><a href="#55"><b class="cmd">::html::tableFromArray</b> <i class="arg">arrname</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">pat</i>?</span></a></li>
<li><a href="#56"><b class="cmd">::html::tableFromList</b> <i class="arg">querylist</i> <span class="opt">?<i class="arg">param</i>?</span></a></li>
<li><a href="#57"><b class="cmd">::html::textarea</b> <i class="arg">name</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">current</i>?</span></a></li>
<li><a href="#58"><b class="cmd">::html::textInput</b> <i class="arg">name value args</i></a></li>
<li><a href="#59"><b class="cmd">::html::textInputRow</b> <i class="arg">label name value args</i></a></li>
<li><a href="#60"><b class="cmd">::html::varEmpty</b> <i class="arg">name</i></a></li>
<li><a href="#61"><b class="cmd">::html::while</b> <i class="arg">test body</i></a></li>
<li><a href="#62"><b class="cmd">::html::doctype</b> <i class="arg">id</i></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
<p>The package <b class="package">html</b> provides commands that generate HTML.
These commands typically return an HTML string as their result. In
particular, they do not output their result to <b class="const">stdout</b>.</p>







<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<







158
159
160
161
162
163
164




165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

188
189
190
191
192
193
194
<li><a href="#28"><b class="cmd">::html::headTag</b> <i class="arg">string</i></a></li>
<li><a href="#29"><b class="cmd">::html::html_entities</b> <i class="arg">string</i></a></li>
<li><a href="#30"><b class="cmd">::html::if</b> <i class="arg">expr1 body1</i> <span class="opt">?<b class="const">elseif</b> <i class="arg">expr2 body2 ...</i>?</span> <span class="opt">?<b class="const">else</b> <i class="arg">bodyN</i>?</span></a></li>
<li><a href="#31"><b class="cmd">::html::init</b> <span class="opt">?<i class="arg">list</i>?</span></a></li>
<li><a href="#32"><b class="cmd">::html::keywords</b> <i class="arg">args</i></a></li>
<li><a href="#33"><b class="cmd">::html::mailto</b> <i class="arg">email</i> <span class="opt">?<i class="arg">subject</i>?</span></a></li>
<li><a href="#34"><b class="cmd">::html::meta</b> <i class="arg">args</i></a></li>




<li><a href="#35"><b class="cmd">::html::minorList</b> <i class="arg">list</i> <span class="opt">?<i class="arg">ordered</i>?</span></a></li>
<li><a href="#36"><b class="cmd">::html::minorMenu</b> <i class="arg">list</i> <span class="opt">?<i class="arg">sep</i>?</span></a></li>
<li><a href="#37"><b class="cmd">::html::nl2br</b> <i class="arg">string</i></a></li>
<li><a href="#38"><b class="cmd">::html::openTag</b> <i class="arg">tag</i> <span class="opt">?<i class="arg">param</i>?</span></a></li>
<li><a href="#39"><b class="cmd">::html::paramRow</b> <i class="arg">list</i> <span class="opt">?<i class="arg">rparam</i>?</span> <span class="opt">?<i class="arg">cparam</i>?</span></a></li>
<li><a href="#40"><b class="cmd">::html::passwordInput</b> <span class="opt">?<i class="arg">name</i>?</span></a></li>
<li><a href="#41"><b class="cmd">::html::passwordInputRow</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></li>
<li><a href="#42"><b class="cmd">::html::quoteFormValue</b> <i class="arg">value</i></a></li>
<li><a href="#43"><b class="cmd">::html::radioSet</b> <i class="arg">key sep list</i></a></li>
<li><a href="#44"><b class="cmd">::html::radioValue</b> <i class="arg">name value</i></a></li>
<li><a href="#45"><b class="cmd">::html::refresh</b> <i class="arg">seconds url</i></a></li>
<li><a href="#46"><b class="cmd">::html::row</b> <i class="arg">args</i></a></li>
<li><a href="#47"><b class="cmd">::html::select</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></li>
<li><a href="#48"><b class="cmd">::html::selectPlain</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></li>
<li><a href="#49"><b class="cmd">::html::set</b> <i class="arg">var val</i></a></li>
<li><a href="#50"><b class="cmd">::html::submit</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></li>
<li><a href="#51"><b class="cmd">::html::tableFromArray</b> <i class="arg">arrname</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">pat</i>?</span></a></li>
<li><a href="#52"><b class="cmd">::html::tableFromList</b> <i class="arg">querylist</i> <span class="opt">?<i class="arg">param</i>?</span></a></li>
<li><a href="#53"><b class="cmd">::html::textarea</b> <i class="arg">name</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">current</i>?</span></a></li>
<li><a href="#54"><b class="cmd">::html::textInput</b> <i class="arg">name value args</i></a></li>
<li><a href="#55"><b class="cmd">::html::textInputRow</b> <i class="arg">label name value args</i></a></li>
<li><a href="#56"><b class="cmd">::html::varEmpty</b> <i class="arg">name</i></a></li>
<li><a href="#57"><b class="cmd">::html::while</b> <i class="arg">test body</i></a></li>

</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
<p>The package <b class="package">html</b> provides commands that generate HTML.
These commands typically return an HTML string as their result. In
particular, they do not output their result to <b class="const">stdout</b>.</p>
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<dt><a name="5"><b class="cmd">::html::checkSet</b> <i class="arg">key sep list</i></a></dt>
<dd><p>Generate a set of <i class="term"><a href="../../../../index.html#key614">checkbox</a></i> form elements and associated labels.  The
<i class="arg">list</i> should contain an alternating list of labels and values.
This uses <b class="cmd">::html::checkbox</b>. All the <i class="term"><a href="../../../../index.html#key614">checkbox</a></i> buttons share the
same <i class="arg">key</i> for their name. The <i class="arg">sep</i> is text used to separate
the elements.</p></dd>
<dt><a name="6"><b class="cmd">::html::checkValue</b> <i class="arg">name</i> <span class="opt">?<i class="arg">value</i>?</span></a></dt>
<dd><p>Generate the &quot;name=<i class="arg">name</i> value=<i class="arg">value</i>&quot; for a <i class="term"><a href="../../../../index.html#key614">checkbox</a></i> form
element.  If the CGI variable <i class="arg">name</i> has the value <i class="arg">value</i>,
then SELECTED is added to the return value. <i class="arg">value</i> defaults to
&quot;1&quot;.</p></dd>
<dt><a name="7"><b class="cmd">::html::closeTag</b></a></dt>
<dd><p>Pop a tag off the stack created by <b class="cmd">::html::openTag</b> and generate
the corresponding close tag (e.g., &lt;/body&gt;).</p></dd>
<dt><a name="8"><b class="cmd">::html::default</b> <i class="arg">key</i> <span class="opt">?<i class="arg">param</i>?</span></a></dt>







|







215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
<dt><a name="5"><b class="cmd">::html::checkSet</b> <i class="arg">key sep list</i></a></dt>
<dd><p>Generate a set of <i class="term"><a href="../../../../index.html#key614">checkbox</a></i> form elements and associated labels.  The
<i class="arg">list</i> should contain an alternating list of labels and values.
This uses <b class="cmd">::html::checkbox</b>. All the <i class="term"><a href="../../../../index.html#key614">checkbox</a></i> buttons share the
same <i class="arg">key</i> for their name. The <i class="arg">sep</i> is text used to separate
the elements.</p></dd>
<dt><a name="6"><b class="cmd">::html::checkValue</b> <i class="arg">name</i> <span class="opt">?<i class="arg">value</i>?</span></a></dt>
<dd><p>Generate the &quot;name=<i class="arg">name</i> value=<i class="arg">value</i> for a <i class="term"><a href="../../../../index.html#key614">checkbox</a></i> form
element.  If the CGI variable <i class="arg">name</i> has the value <i class="arg">value</i>,
then SELECTED is added to the return value. <i class="arg">value</i> defaults to
&quot;1&quot;.</p></dd>
<dt><a name="7"><b class="cmd">::html::closeTag</b></a></dt>
<dd><p>Pop a tag off the stack created by <b class="cmd">::html::openTag</b> and generate
the corresponding close tag (e.g., &lt;/body&gt;).</p></dd>
<dt><a name="8"><b class="cmd">::html::default</b> <i class="arg">key</i> <span class="opt">?<i class="arg">param</i>?</span></a></dt>
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
<dd><p>Generate a hypertext link to a mailto: URL.</p></dd>
<dt><a name="34"><b class="cmd">::html::meta</b> <i class="arg">args</i></a></dt>
<dd><p><em>Side effect only</em>.  Call this before <b class="cmd">::html::head</b> to
define a <i class="term">meta</i> tag for the page.  The <i class="arg">args</i> is a Tcl-style name,
value list that is used for the name= and value= parameters for the
<i class="term">meta</i> tag.  The <i class="term">meta</i> tag is included in the result of
<b class="cmd">::html::head</b>.</p></dd>
<dt><a name="35"><b class="cmd">::html::css</b> <i class="arg">href</i></a></dt>
<dd><p><em>Side effect only</em>.  Call this before <b class="cmd">::html::head</b> to
define a <i class="term">link</i> tag for a linked CSS document.  The <i class="arg">href</i> 
value is a HTTP URL to a CSS document. The <i class="term">link</i> tag is included 
in the result of <b class="cmd">::html::head</b>.</p>
<p>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.</p></dd>
<dt><a name="36"><b class="cmd">::html::css-clear</b></a></dt>
<dd><p><em>Side effect only</em>.  Call this before <b class="cmd">::html::head</b> to
clear all links to CSS documents.</p>
<p>Multiple calls of this command are allowed, doing nothing after the
first of a sequence with no intervening <b class="cmd">::html::css</b>.</p></dd>
<dt><a name="37"><b class="cmd">::html::js</b> <i class="arg">href</i></a></dt>
<dd><p><em>Side effect only</em>.  Call this before <b class="cmd">::html::head</b> to
define a <i class="term">script</i> tag for a linked JavaScript document.  The 
<i class="arg">href</i> is a HTTP URL to a JavaScript document. The <i class="term">script</i>
tag is included in the result of <b class="cmd">::html::head</b>.</p>
<p>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.</p></dd>
<dt><a name="38"><b class="cmd">::html::js-clear</b></a></dt>
<dd><p><em>Side effect only</em>.  Call this before <b class="cmd">::html::head</b> to
clear all links to JavaScript documents.</p>
<p>Multiple calls of this command are allowed, doing nothing after the
first of a sequence with no intervening <b class="cmd">::html::js</b>.</p></dd>
<dt><a name="39"><b class="cmd">::html::minorList</b> <i class="arg">list</i> <span class="opt">?<i class="arg">ordered</i>?</span></a></dt>
<dd><p>Generate an ordered or unordered list of links.  The <i class="arg">list</i> is a
Tcl-style name, value list of labels and urls for the links.
<i class="arg">ordered</i> is a boolean used to choose between an ordered or
unordered list. It defaults to <b class="const">false</b>.</p></dd>
<dt><a name="40"><b class="cmd">::html::minorMenu</b> <i class="arg">list</i> <span class="opt">?<i class="arg">sep</i>?</span></a></dt>
<dd><p>Generate a series of hypertext links.  The <i class="arg">list</i> is a Tcl-style
name, value list of labels and urls for the links.  The <i class="arg">sep</i> is
the text to put between each link. It defaults to &quot; | &quot;.</p></dd>
<dt><a name="41"><b class="cmd">::html::nl2br</b> <i class="arg">string</i></a></dt>
<dd><p>This command replaces all line-endings in the <i class="arg">string</i> with a
<i class="term">br</i> tag and returns the modified text.</p></dd>
<dt><a name="42"><b class="cmd">::html::openTag</b> <i class="arg">tag</i> <span class="opt">?<i class="arg">param</i>?</span></a></dt>
<dd><p>Push <i class="arg">tag</i> onto a stack and generate the opening tag for
<i class="arg">tag</i>. Use <b class="cmd">::html::closeTag</b> to pop the tag from the
stack. The second argument provides any tag arguments, as a
list whose elements are formatted to be in the form
&quot;<b class="variable">key</b>=<b class="const">value</b>&quot;.</p></dd>
<dt><a name="43"><b class="cmd">::html::paramRow</b> <i class="arg">list</i> <span class="opt">?<i class="arg">rparam</i>?</span> <span class="opt">?<i class="arg">cparam</i>?</span></a></dt>
<dd><p>Generate a table row, including <i class="term">tr</i> and <i class="term">td</i> tags. Each value in
<i class="arg">list</i> is placed into its own table cell. This uses
<b class="cmd">::html::cell</b>. The value of <i class="arg">rparam</i> is used as parameter for
the <i class="term">tr</i> tag. The value of <i class="arg">cparam</i> is passed to <b class="cmd">::html::cell</b>
as parameter for the <i class="term">td</i> tags.</p></dd>
<dt><a name="44"><b class="cmd">::html::passwordInput</b> <span class="opt">?<i class="arg">name</i>?</span></a></dt>
<dd><p>Generate an <i class="term">input</i> tag of type <i class="term"><a href="../../../../index.html#key685">password</a></i>. The <i class="arg">name</i> defaults to
&quot;password&quot;.</p></dd>
<dt><a name="45"><b class="cmd">::html::passwordInputRow</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></dt>
<dd><p>Format a table row containing a label and an <i class="term">input</i> tag of type
<i class="term"><a href="../../../../index.html#key685">password</a></i>. The <i class="arg">name</i> defaults to &quot;password&quot;.</p></dd>
<dt><a name="46"><b class="cmd">::html::quoteFormValue</b> <i class="arg">value</i></a></dt>
<dd><p>Quote special characters in <i class="arg">value</i> by replacing them with HTML
entities for quotes, ampersand, and angle brackets.</p></dd>
<dt><a name="47"><b class="cmd">::html::radioSet</b> <i class="arg">key sep list</i></a></dt>
<dd><p>Generate a set of <i class="term">input</i> tags of type <i class="term">radio</i> and an associated text
label.  All the radio buttons share the same <i class="arg">key</i> for their name.
The <i class="arg">sep</i> is text used to separate the elements.  The <i class="arg">list</i>
is a Tcl-style label, value list.</p></dd>
<dt><a name="48"><b class="cmd">::html::radioValue</b> <i class="arg">name value</i></a></dt>
<dd><p>Generate the &quot;name=<i class="arg">name</i> value=<i class="arg">value</i>&quot; for a <i class="term">radio</i> form
element.  If the CGI variable <i class="arg">name</i> has the value <i class="arg">value</i>,
then SELECTED is added to the return value.</p></dd>
<dt><a name="49"><b class="cmd">::html::refresh</b> <i class="arg">seconds url</i></a></dt>
<dd><p>Set up a refresh <i class="term">meta</i> tag. Call this before <b class="cmd">::html::head</b> and the
HEAD section will contain a <i class="term">meta</i> tag that causes the document to
refresh in <i class="arg">seconds</i> seconds.  The <i class="arg">url</i> is optional.  If
specified, it specifies a new page to load after the refresh interval.</p></dd>
<dt><a name="50"><b class="cmd">::html::row</b> <i class="arg">args</i></a></dt>
<dd><p>Generate a table row, including <i class="term">tr</i> and <i class="term">td</i> tags.  Each value in
<i class="arg">args</i> is place into its own table cell. This uses
<b class="cmd">::html::cell</b>. Ignores any default information set up via
<b class="cmd">::html::init</b>.</p></dd>
<dt><a name="51"><b class="cmd">::html::select</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></dt>
<dd><p>Generate a <i class="term">select</i> form element and nested <i class="term">option</i> tags. The <i class="arg">name</i>
and <i class="arg">param</i> are used to generate the <i class="term">select</i> tag. The <i class="arg">choices</i>
list is a Tcl-style name, value list.</p></dd>
<dt><a name="52"><b class="cmd">::html::selectPlain</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></dt>
<dd><p>Like <b class="cmd">::html::select</b> except that <i class="arg">choices</i> is a Tcl list of
values used for the <i class="term">option</i> tags.  The label and the value for each
<i class="term">option</i> are the same.</p></dd>
<dt><a name="53"><b class="cmd">::html::set</b> <i class="arg">var val</i></a></dt>
<dd><p>This procedure is similar to the built-in Tcl <b class="cmd"><a href="../../../../index.html#key297">set</a></b> command.  The
main difference is that it returns &quot;&quot; so it can be called from an HTML
template file without appending unwanted results.  The other
difference is that it must take two arguments.</p></dd>
<dt><a name="54"><b class="cmd">::html::submit</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></dt>
<dd><p>Generate an <i class="term">input</i> tag of type <i class="term">submit</i>. <i class="arg">name</i> defaults to &quot;submit&quot;.</p></dd>
<dt><a name="55"><b class="cmd">::html::tableFromArray</b> <i class="arg">arrname</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">pat</i>?</span></a></dt>
<dd><p>Generate a two-column <i class="term"><a href="../../../../index.html#key106">table</a></i> and nested rows to display a Tcl array. The
table gets a heading that matches the array name, and each generated row
contains a name, value pair. The array names are sorted (<b class="cmd">lsort</b> without
special options). The argument <i class="arg">param</i> is for the <i class="term"><a href="../../../../index.html#key106">table</a></i> tag and has
to contain a pre-formatted string. The <i class="arg">pat</i> is a <b class="cmd">string match</b>
pattern used to select the array elements to show in the table. It defaults to
<b class="const">*</b>, i.e. the whole array is shown.</p></dd>
<dt><a name="56"><b class="cmd">::html::tableFromList</b> <i class="arg">querylist</i> <span class="opt">?<i class="arg">param</i>?</span></a></dt>
<dd><p>Generate a two-column <i class="term"><a href="../../../../index.html#key106">table</a></i> and nested rows to display <i class="arg">querylist</i>,
which is a Tcl dictionary. Each generated row contains a name, value pair. The
information is shown in the same order as specified in the dictionary. The
argument <i class="arg">param</i> is for the <i class="term"><a href="../../../../index.html#key106">table</a></i> tag  and has to contain a
pre-formatted string.</p></dd>
<dt><a name="57"><b class="cmd">::html::textarea</b> <i class="arg">name</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">current</i>?</span></a></dt>
<dd><p>Generate a <i class="term">textarea</i> tag wrapped around its current values.</p></dd>
<dt><a name="58"><b class="cmd">::html::textInput</b> <i class="arg">name value args</i></a></dt>
<dd><p>Generate an <i class="term">input</i> form tag with type <i class="term"><a href="../../../../index.html#key246">text</a></i>.  This uses
<b class="cmd">::html::formValue</b>.  The args is any additional tag attributes
you want to put into the <i class="term">input</i> tag.</p></dd>
<dt><a name="59"><b class="cmd">::html::textInputRow</b> <i class="arg">label name value args</i></a></dt>
<dd><p>Generate an <i class="term">input</i> form tag with type <i class="term"><a href="../../../../index.html#key246">text</a></i> formatted into a table row
with an associated label.  The args is any additional tag attributes
you want to put into the <i class="term">input</i> tag.</p></dd>
<dt><a name="60"><b class="cmd">::html::varEmpty</b> <i class="arg">name</i></a></dt>
<dd><p>This returns 1 if the named variable either does not exist or has the
empty string for its value.</p></dd>
<dt><a name="61"><b class="cmd">::html::while</b> <i class="arg">test body</i></a></dt>
<dd><p>This procedure is similar to the built-in Tcl <b class="cmd">while</b> control
structure.  Rather than evaluating the body, it returns the subst'ed
<i class="arg">body</i>.  Each iteration of the loop causes another string to be
concatenated to the result value.</p></dd>
<dt><a name="62"><b class="cmd">::html::doctype</b> <i class="arg">id</i></a></dt>
<dd><p>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:</p>
<ol class="enumerated">
<li><p>HTML32</p></li>
<li><p>HTML40</p></li>
<li><p>HTML40T</p></li>
<li><p>HTML40F</p></li>
<li><p>HTML401</p></li>
<li><p>HTML401T</p></li>
<li><p>HTML401F</p></li>
<li><p>XHTML10S</p></li>
<li><p>XHTML10T</p></li>
<li><p>XHTML10F</p></li>
<li><p>XHTML11</p></li>
<li><p>XHTMLB</p></li>
</ol></dd>
</dl>
</div>
<div id="section2" class="section"><h2><a name="section2">Bugs, Ideas, Feedback</a></h2>
<p>This document, and the package it describes, will undoubtedly contain
bugs and other problems.
Please report such in the category <em>html</em> of the
<a href="http://core.tcl.tk/tcllib/reportlist">Tcllib Trackers</a>.







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|




|



|


|





|





|


|


|


|




|
|


|




|




|



|



|




|

|







|





|

|



|



|


|




<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







338
339
340
341
342
343
344


























345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443



















444
445
446
447
448
449
450
<dd><p>Generate a hypertext link to a mailto: URL.</p></dd>
<dt><a name="34"><b class="cmd">::html::meta</b> <i class="arg">args</i></a></dt>
<dd><p><em>Side effect only</em>.  Call this before <b class="cmd">::html::head</b> to
define a <i class="term">meta</i> tag for the page.  The <i class="arg">args</i> is a Tcl-style name,
value list that is used for the name= and value= parameters for the
<i class="term">meta</i> tag.  The <i class="term">meta</i> tag is included in the result of
<b class="cmd">::html::head</b>.</p></dd>


























<dt><a name="35"><b class="cmd">::html::minorList</b> <i class="arg">list</i> <span class="opt">?<i class="arg">ordered</i>?</span></a></dt>
<dd><p>Generate an ordered or unordered list of links.  The <i class="arg">list</i> is a
Tcl-style name, value list of labels and urls for the links.
<i class="arg">ordered</i> is a boolean used to choose between an ordered or
unordered list. It defaults to <b class="const">false</b>.</p></dd>
<dt><a name="36"><b class="cmd">::html::minorMenu</b> <i class="arg">list</i> <span class="opt">?<i class="arg">sep</i>?</span></a></dt>
<dd><p>Generate a series of hypertext links.  The <i class="arg">list</i> is a Tcl-style
name, value list of labels and urls for the links.  The <i class="arg">sep</i> is
the text to put between each link. It defaults to &quot; | &quot;.</p></dd>
<dt><a name="37"><b class="cmd">::html::nl2br</b> <i class="arg">string</i></a></dt>
<dd><p>This command replaces all line-endings in the <i class="arg">string</i> with a
<i class="term">br</i> tag and returns the modified text.</p></dd>
<dt><a name="38"><b class="cmd">::html::openTag</b> <i class="arg">tag</i> <span class="opt">?<i class="arg">param</i>?</span></a></dt>
<dd><p>Push <i class="arg">tag</i> onto a stack and generate the opening tag for
<i class="arg">tag</i>. Use <b class="cmd">::html::closeTag</b> to pop the tag from the
stack. The second argument provides any tag arguments, as a
list whose elements are formatted to be in the form
&quot;<b class="variable">key</b>=<b class="const">value</b>&quot;.</p></dd>
<dt><a name="39"><b class="cmd">::html::paramRow</b> <i class="arg">list</i> <span class="opt">?<i class="arg">rparam</i>?</span> <span class="opt">?<i class="arg">cparam</i>?</span></a></dt>
<dd><p>Generate a table row, including <i class="term">tr</i> and <i class="term">td</i> tags. Each value in
<i class="arg">list</i> is placed into its own table cell. This uses
<b class="cmd">::html::cell</b>. The value of <i class="arg">rparam</i> is used as parameter for
the <i class="term">tr</i> tag. The value of <i class="arg">cparam</i> is passed to <b class="cmd">::html::cell</b>
as parameter for the <i class="term">td</i> tags.</p></dd>
<dt><a name="40"><b class="cmd">::html::passwordInput</b> <span class="opt">?<i class="arg">name</i>?</span></a></dt>
<dd><p>Generate an <i class="term">input</i> tag of type <i class="term"><a href="../../../../index.html#key685">password</a></i>. The <i class="arg">name</i> defaults to
&quot;password&quot;.</p></dd>
<dt><a name="41"><b class="cmd">::html::passwordInputRow</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></dt>
<dd><p>Format a table row containing a label and an <i class="term">input</i> tag of type
<i class="term"><a href="../../../../index.html#key685">password</a></i>. The <i class="arg">name</i> defaults to &quot;password&quot;.</p></dd>
<dt><a name="42"><b class="cmd">::html::quoteFormValue</b> <i class="arg">value</i></a></dt>
<dd><p>Quote special characters in <i class="arg">value</i> by replacing them with HTML
entities for quotes, ampersand, and angle brackets.</p></dd>
<dt><a name="43"><b class="cmd">::html::radioSet</b> <i class="arg">key sep list</i></a></dt>
<dd><p>Generate a set of <i class="term">input</i> tags of type <i class="term">radio</i> and an associated text
label.  All the radio buttons share the same <i class="arg">key</i> for their name.
The <i class="arg">sep</i> is text used to separate the elements.  The <i class="arg">list</i>
is a Tcl-style label, value list.</p></dd>
<dt><a name="44"><b class="cmd">::html::radioValue</b> <i class="arg">name value</i></a></dt>
<dd><p>Generate the &quot;name=<i class="arg">name</i> value=<i class="arg">value</i> for a <i class="term">radio</i> form
element.  If the CGI variable <i class="arg">name</i> has the value <i class="arg">value</i>,
then SELECTED is added to the return value.</p></dd>
<dt><a name="45"><b class="cmd">::html::refresh</b> <i class="arg">seconds url</i></a></dt>
<dd><p>Set up a refresh <i class="term">meta</i> tag. Call this before <b class="cmd">::html::head</b> and the
HEAD section will contain a <i class="term">meta</i> tag that causes the document to
refresh in <i class="arg">seconds</i> seconds.  The <i class="arg">url</i> is optional.  If
specified, it specifies a new page to load after the refresh interval.</p></dd>
<dt><a name="46"><b class="cmd">::html::row</b> <i class="arg">args</i></a></dt>
<dd><p>Generate a table row, including <i class="term">tr</i> and <i class="term">td</i> tags.  Each value in
<i class="arg">args</i> is place into its own table cell. This uses
<b class="cmd">::html::cell</b>. Ignores any default information set up via
<b class="cmd">::html::init</b>.</p></dd>
<dt><a name="47"><b class="cmd">::html::select</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></dt>
<dd><p>Generate a <i class="term">select</i> form element and nested <i class="term">option</i> tags. The <i class="arg">name</i>
and <i class="arg">param</i> are used to generate the <i class="term">select</i> tag. The <i class="arg">choices</i>
list is a Tcl-style name, value list.</p></dd>
<dt><a name="48"><b class="cmd">::html::selectPlain</b> <i class="arg">name param choices</i> <span class="opt">?<i class="arg">current</i>?</span></a></dt>
<dd><p>Like <b class="cmd">::html::select</b> except that <i class="arg">choices</i> is a Tcl list of
values used for the <i class="term">option</i> tags.  The label and the value for each
<i class="term">option</i> are the same.</p></dd>
<dt><a name="49"><b class="cmd">::html::set</b> <i class="arg">var val</i></a></dt>
<dd><p>This procedure is similar to the built-in Tcl <b class="cmd"><a href="../../../../index.html#key297">set</a></b> command.  The
main difference is that it returns &quot;&quot; so it can be called from an HTML
template file without appending unwanted results.  The other
difference is that it must take two arguments.</p></dd>
<dt><a name="50"><b class="cmd">::html::submit</b> <i class="arg">label</i> <span class="opt">?<i class="arg">name</i>?</span></a></dt>
<dd><p>Generate an <i class="term">input</i> tag of type <i class="term">submit</i>. <i class="arg">name</i> defaults to &quot;submit&quot;.</p></dd>
<dt><a name="51"><b class="cmd">::html::tableFromArray</b> <i class="arg">arrname</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">pat</i>?</span></a></dt>
<dd><p>Generate a two-column <i class="term"><a href="../../../../index.html#key106">table</a></i> and nested rows to display a Tcl array. The
table gets a heading that matches the array name, and each generated row
contains a name, value pair. The array names are sorted (<b class="cmd">lsort</b> without
special options). The argument <i class="arg">param</i> is for the <i class="term"><a href="../../../../index.html#key106">table</a></i> tag and has
to contain a pre-formatted string. The <i class="arg">pat</i> is a <b class="cmd">string match</b>
pattern used to select the array elements to show in the table. It defaults to
<b class="const">*</b>, i.e. the whole array is shown.</p></dd>
<dt><a name="52"><b class="cmd">::html::tableFromList</b> <i class="arg">querylist</i> <span class="opt">?<i class="arg">param</i>?</span></a></dt>
<dd><p>Generate a two-column <i class="term"><a href="../../../../index.html#key106">table</a></i> and nested rows to display <i class="arg">querylist</i>,
which is a Tcl dictionary. Each generated row contains a name, value pair. The
information is shown in the same order as specified in the dictionary. The
argument <i class="arg">param</i> is for the <i class="term"><a href="../../../../index.html#key106">table</a></i> tag  and has to contain a
pre-formatted string.</p></dd>
<dt><a name="53"><b class="cmd">::html::textarea</b> <i class="arg">name</i> <span class="opt">?<i class="arg">param</i>?</span> <span class="opt">?<i class="arg">current</i>?</span></a></dt>
<dd><p>Generate a <i class="term">textarea</i> tag wrapped around its current values.</p></dd>
<dt><a name="54"><b class="cmd">::html::textInput</b> <i class="arg">name value args</i></a></dt>
<dd><p>Generate an <i class="term">input</i> form tag with type <i class="term"><a href="../../../../index.html#key246">text</a></i>.  This uses
<b class="cmd">::html::formValue</b>.  The args is any additional tag attributes
you want to put into the <i class="term">input</i> tag.</p></dd>
<dt><a name="55"><b class="cmd">::html::textInputRow</b> <i class="arg">label name value args</i></a></dt>
<dd><p>Generate an <i class="term">input</i> form tag with type <i class="term"><a href="../../../../index.html#key246">text</a></i> formatted into a table row
with an associated label.  The args is any additional tag attributes
you want to put into the <i class="term">input</i> tag.</p></dd>
<dt><a name="56"><b class="cmd">::html::varEmpty</b> <i class="arg">name</i></a></dt>
<dd><p>This returns 1 if the named variable either does not exist or has the
empty string for its value.</p></dd>
<dt><a name="57"><b class="cmd">::html::while</b> <i class="arg">test body</i></a></dt>
<dd><p>This procedure is similar to the built-in Tcl <b class="cmd">while</b> control
structure.  Rather than evaluating the body, it returns the subst'ed
<i class="arg">body</i>.  Each iteration of the loop causes another string to be
concatenated to the result value.</p></dd>



















</dl>
</div>
<div id="section2" class="section"><h2><a name="section2">Bugs, Ideas, Feedback</a></h2>
<p>This document, and the package it describes, will undoubtedly contain
bugs and other problems.
Please report such in the category <em>html</em> of the
<a href="http://core.tcl.tk/tcllib/reportlist">Tcllib Trackers</a>.
Changes to embedded/www/tcllib/files/modules/json/json_write.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">json::write(n) 1.0.3 tcllib &quot;JSON&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>json::write - JSON generation</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">COMMANDS</a></li>
<li class="section"><a href="#section3">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">json::write <span class="opt">?1.0.3?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::json::write</b> <b class="method">indented</b></a></li>
<li><a href="#2"><b class="cmd">::json::write</b> <b class="method">indented</b> <i class="arg">flag</i></a></li>
<li><a href="#3"><b class="cmd">::json::write</b> <b class="method">aligned</b></a></li>
<li><a href="#4"><b class="cmd">::json::write</b> <b class="method">aligned</b> <i class="arg">flag</i></a></li>
<li><a href="#5"><b class="cmd">::json::write</b> <b class="method">string</b> <i class="arg">s</i></a></li>







|



















|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">json::write(n) 1.0.2 tcllib &quot;JSON&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>json::write - JSON generation</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">COMMANDS</a></li>
<li class="section"><a href="#section3">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">json::write <span class="opt">?1.0.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::json::write</b> <b class="method">indented</b></a></li>
<li><a href="#2"><b class="cmd">::json::write</b> <b class="method">indented</b> <i class="arg">flag</i></a></li>
<li><a href="#3"><b class="cmd">::json::write</b> <b class="method">aligned</b></a></li>
<li><a href="#4"><b class="cmd">::json::write</b> <b class="method">aligned</b> <i class="arg">flag</i></a></li>
<li><a href="#5"><b class="cmd">::json::write</b> <b class="method">string</b> <i class="arg">s</i></a></li>
Changes to embedded/www/tcllib/files/modules/math/math_geometry.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">math::geometry(n) 1.1.3 tcllib &quot;Tcl Math Library&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>math::geometry - Geometrical computations</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">PROCEDURES</a></li>
<li class="section"><a href="#section3">References</a></li>
<li class="section"><a href="#section4">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl <span class="opt">?8.3?</span></b></li>
<li>package require <b class="pkgname">math::geometry <span class="opt">?1.1.3?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::math::geometry::+</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li>
<li><a href="#2"><b class="cmd">::math::geometry::-</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li>
<li><a href="#3"><b class="cmd">::math::geometry::p</b> <i class="arg">x</i> <i class="arg">y</i></a></li>
<li><a href="#4"><b class="cmd">::math::geometry::distance</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li>
<li><a href="#5"><b class="cmd">::math::geometry::length</b> <i class="arg">point</i></a></li>
<li><a href="#6"><b class="cmd">::math::geometry::s*</b> <i class="arg">factor</i> <i class="arg">point</i></a></li>
<li><a href="#7"><b class="cmd">::math::geometry::direction</b> <i class="arg">angle</i></a></li>
<li><a href="#8"><b class="cmd">::math::geometry::h</b> <i class="arg">length</i></a></li>
<li><a href="#9"><b class="cmd">::math::geometry::v</b> <i class="arg">length</i></a></li>
<li><a href="#10"><b class="cmd">::math::geometry::between</b> <i class="arg">point1</i> <i class="arg">point2</i> <i class="arg">s</i></a></li>
<li><a href="#11"><b class="cmd">::math::geometry::octant</b> <i class="arg">point</i></a></li>
<li><a href="#12"><b class="cmd">::math::geometry::rect</b> <i class="arg">nw</i> <i class="arg">se</i></a></li>
<li><a href="#13"><b class="cmd">::math::geometry::nwse</b> <i class="arg">rect</i></a></li>
<li><a href="#14"><b class="cmd">::math::geometry::angle</b> <i class="arg">line</i></a></li>
<li><a href="#15"><b class="cmd">::math::geometry::calculateDistanceToLine</b> <i class="arg">P</i> <i class="arg">line</i></a></li>
<li><a href="#16"><b class="cmd">::math::geometry::calculateDistanceToLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></li>
<li><a href="#17"><b class="cmd">::math::geometry::calculateDistanceToPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li>
<li><a href="#18"><b class="cmd">::math::geometry::calculateDistanceToPolygon</b> <i class="arg">P</i> <i class="arg">polygon</i></a></li>
<li><a href="#19"><b class="cmd">::math::geometry::findClosestPointOnLine</b> <i class="arg">P</i> <i class="arg">line</i></a></li>
<li><a href="#20"><b class="cmd">::math::geometry::findClosestPointOnLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></li>
<li><a href="#21"><b class="cmd">::math::geometry::findClosestPointOnPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li>
<li><a href="#22"><b class="cmd">::math::geometry::lengthOfPolyline</b> <i class="arg">polyline</i></a></li>
<li><a href="#23"><b class="cmd">::math::geometry::movePointInDirection</b> <i class="arg">P</i> <i class="arg">direction</i> <i class="arg">dist</i></a></li>
<li><a href="#24"><b class="cmd">::math::geometry::lineSegmentsIntersect</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></li>
<li><a href="#25"><b class="cmd">::math::geometry::findLineSegmentIntersection</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></li>
<li><a href="#26"><b class="cmd">::math::geometry::findLineIntersection</b> <i class="arg">line1</i> <i class="arg">line2</i></a></li>
<li><a href="#27"><b class="cmd">::math::geometry::polylinesIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i></a></li>
<li><a href="#28"><b class="cmd">::math::geometry::polylinesBoundingIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i> <i class="arg">granularity</i></a></li>
<li><a href="#29"><b class="cmd">::math::geometry::intervalsOverlap</b> <i class="arg">y1</i> <i class="arg">y2</i> <i class="arg">y3</i> <i class="arg">y4</i> <i class="arg">strict</i></a></li>
<li><a href="#30"><b class="cmd">::math::geometry::rectanglesOverlap</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">Q1</i> <i class="arg">Q2</i> <i class="arg">strict</i></a></li>
<li><a href="#31"><b class="cmd">::math::geometry::bbox</b> <i class="arg">polyline</i></a></li>
<li><a href="#32"><b class="cmd">::math::geometry::pointInsidePolygon</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li>
<li><a href="#33"><b class="cmd">::math::geometry::rectangleInsidePolygon</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">polyline</i></a></li>
<li><a href="#34"><b class="cmd">::math::geometry::areaPolygon</b> <i class="arg">polygon</i></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
<p>The <b class="package">math::geometry</b> package is a collection of functions for
computations and manipulations on two-dimensional geometrical objects,
such as points, lines and polygons.</p>







|




















|



















<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">math::geometry(n) 1.1.2 tcllib &quot;Tcl Math Library&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>math::geometry - Geometrical computations</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">PROCEDURES</a></li>
<li class="section"><a href="#section3">References</a></li>
<li class="section"><a href="#section4">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl <span class="opt">?8.3?</span></b></li>
<li>package require <b class="pkgname">math::geometry <span class="opt">?1.1.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::math::geometry::+</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li>
<li><a href="#2"><b class="cmd">::math::geometry::-</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li>
<li><a href="#3"><b class="cmd">::math::geometry::p</b> <i class="arg">x</i> <i class="arg">y</i></a></li>
<li><a href="#4"><b class="cmd">::math::geometry::distance</b> <i class="arg">point1</i> <i class="arg">point2</i></a></li>
<li><a href="#5"><b class="cmd">::math::geometry::length</b> <i class="arg">point</i></a></li>
<li><a href="#6"><b class="cmd">::math::geometry::s*</b> <i class="arg">factor</i> <i class="arg">point</i></a></li>
<li><a href="#7"><b class="cmd">::math::geometry::direction</b> <i class="arg">angle</i></a></li>
<li><a href="#8"><b class="cmd">::math::geometry::h</b> <i class="arg">length</i></a></li>
<li><a href="#9"><b class="cmd">::math::geometry::v</b> <i class="arg">length</i></a></li>
<li><a href="#10"><b class="cmd">::math::geometry::between</b> <i class="arg">point1</i> <i class="arg">point2</i> <i class="arg">s</i></a></li>
<li><a href="#11"><b class="cmd">::math::geometry::octant</b> <i class="arg">point</i></a></li>
<li><a href="#12"><b class="cmd">::math::geometry::rect</b> <i class="arg">nw</i> <i class="arg">se</i></a></li>
<li><a href="#13"><b class="cmd">::math::geometry::nwse</b> <i class="arg">rect</i></a></li>
<li><a href="#14"><b class="cmd">::math::geometry::angle</b> <i class="arg">line</i></a></li>
<li><a href="#15"><b class="cmd">::math::geometry::calculateDistanceToLine</b> <i class="arg">P</i> <i class="arg">line</i></a></li>
<li><a href="#16"><b class="cmd">::math::geometry::calculateDistanceToLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></li>
<li><a href="#17"><b class="cmd">::math::geometry::calculateDistanceToPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li>

<li><a href="#18"><b class="cmd">::math::geometry::findClosestPointOnLine</b> <i class="arg">P</i> <i class="arg">line</i></a></li>
<li><a href="#19"><b class="cmd">::math::geometry::findClosestPointOnLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></li>
<li><a href="#20"><b class="cmd">::math::geometry::findClosestPointOnPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li>
<li><a href="#21"><b class="cmd">::math::geometry::lengthOfPolyline</b> <i class="arg">polyline</i></a></li>
<li><a href="#22"><b class="cmd">::math::geometry::movePointInDirection</b> <i class="arg">P</i> <i class="arg">direction</i> <i class="arg">dist</i></a></li>
<li><a href="#23"><b class="cmd">::math::geometry::lineSegmentsIntersect</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></li>
<li><a href="#24"><b class="cmd">::math::geometry::findLineSegmentIntersection</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></li>
<li><a href="#25"><b class="cmd">::math::geometry::findLineIntersection</b> <i class="arg">line1</i> <i class="arg">line2</i></a></li>
<li><a href="#26"><b class="cmd">::math::geometry::polylinesIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i></a></li>
<li><a href="#27"><b class="cmd">::math::geometry::polylinesBoundingIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i> <i class="arg">granularity</i></a></li>
<li><a href="#28"><b class="cmd">::math::geometry::intervalsOverlap</b> <i class="arg">y1</i> <i class="arg">y2</i> <i class="arg">y3</i> <i class="arg">y4</i> <i class="arg">strict</i></a></li>
<li><a href="#29"><b class="cmd">::math::geometry::rectanglesOverlap</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">Q1</i> <i class="arg">Q2</i> <i class="arg">strict</i></a></li>
<li><a href="#30"><b class="cmd">::math::geometry::bbox</b> <i class="arg">polyline</i></a></li>
<li><a href="#31"><b class="cmd">::math::geometry::pointInsidePolygon</b> <i class="arg">P</i> <i class="arg">polyline</i></a></li>
<li><a href="#32"><b class="cmd">::math::geometry::rectangleInsidePolygon</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">polyline</i></a></li>
<li><a href="#33"><b class="cmd">::math::geometry::areaPolygon</b> <i class="arg">polygon</i></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
<p>The <b class="package">math::geometry</b> package is a collection of functions for
computations and manipulations on two-dimensional geometrical objects,
such as points, lines and polygons.</p>
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">linesegment</i></dt>
<dd><p>List of four numbers, the coordinates of the
first and last points of the line segment</p></dd>
</dl></dd>
<dt><a name="17"><b class="cmd">::math::geometry::calculateDistanceToPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt>
<dd><p>Calculate the distance of point P to the polyline and
return the result. Note that a polyline needs not to be closed.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">polyline</i></dt>
<dd><p>List of numbers, the coordinates of the
vertices of the polyline</p></dd>
</dl></dd>
<dt><a name="18"><b class="cmd">::math::geometry::calculateDistanceToPolygon</b> <i class="arg">P</i> <i class="arg">polygon</i></a></dt>
<dd><p>Calculate the distance of point P to the polygon and
return the result. If the list of coordinates is not closed (first and last
points differ), it is automatically closed.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">polygon</i></dt>
<dd><p>List of numbers, the coordinates of the
vertices of the polygon</p></dd>
</dl></dd>
<dt><a name="19"><b class="cmd">::math::geometry::findClosestPointOnLine</b> <i class="arg">P</i> <i class="arg">line</i></a></dt>
<dd><p>Return the point on a line which is closest to a given point.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">line</i></dt>
<dd><p>List of four numbers, the coordinates of two points
on the line</p></dd>
</dl></dd>
<dt><a name="20"><b class="cmd">::math::geometry::findClosestPointOnLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></dt>
<dd><p>Return the point on a <em>line segment</em> which is closest to a given
point.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">linesegment</i></dt>
<dd><p>List of four numbers, the first and last
points on the line segment</p></dd>
</dl></dd>
<dt><a name="21"><b class="cmd">::math::geometry::findClosestPointOnPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt>
<dd><p>Return the point on a <em>polyline</em> which is closest to a given
point.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">polyline</i></dt>
<dd><p>List of numbers, the vertices of the polyline</p></dd>
</dl></dd>
<dt><a name="22"><b class="cmd">::math::geometry::lengthOfPolyline</b> <i class="arg">polyline</i></a></dt>
<dd><p>Return the length of the <em>polyline</em> (note: it not regarded as a
polygon)</p>
<dl class="arguments">
<dt>list <i class="arg">polyline</i></dt>
<dd><p>List of numbers, the vertices of the polyline</p></dd>
</dl></dd>
<dt><a name="23"><b class="cmd">::math::geometry::movePointInDirection</b> <i class="arg">P</i> <i class="arg">direction</i> <i class="arg">dist</i></a></dt>
<dd><p>Move a point over a given distance in a given direction and return the
new coordinates (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>Coordinates of the point to be moved</p></dd>
<dt>double <i class="arg">direction</i></dt>
<dd><p>Direction (in degrees; 0 is to the right, 90
upwards)</p></dd>
<dt>list <i class="arg">dist</i></dt>
<dd><p>Distance over which to move the point</p></dd>
</dl></dd>
<dt><a name="24"><b class="cmd">::math::geometry::lineSegmentsIntersect</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></dt>
<dd><p>Check if two line segments intersect or coincide. Returns 1 if that is
the case, 0 otherwise (in two dimensions only). If an endpoint of one segment lies on
the other segment (or is very close to the segment), they are considered to intersect</p>
<dl class="arguments">
<dt>list <i class="arg">linesegment1</i></dt>
<dd><p>First line segment</p></dd>
<dt>list <i class="arg">linesegment2</i></dt>
<dd><p>Second line segment</p></dd>
</dl></dd>
<dt><a name="25"><b class="cmd">::math::geometry::findLineSegmentIntersection</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></dt>
<dd><p>Find the intersection point of two line segments. Return the coordinates
or the keywords &quot;coincident&quot; or &quot;none&quot; if the line segments coincide or
have no points in common (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">linesegment1</i></dt>
<dd><p>First line segment</p></dd>
<dt>list <i class="arg">linesegment2</i></dt>
<dd><p>Second line segment</p></dd>
</dl></dd>
<dt><a name="26"><b class="cmd">::math::geometry::findLineIntersection</b> <i class="arg">line1</i> <i class="arg">line2</i></a></dt>
<dd><p>Find the intersection point of two (infinite) lines. Return the coordinates
or the keywords &quot;coincident&quot; or &quot;none&quot; if the lines coincide or
have no points in common (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">line1</i></dt>
<dd><p>First line</p></dd>
<dt>list <i class="arg">line2</i></dt>
<dd><p>Second line</p></dd>
</dl>
<p>See section <span class="sectref"><a href="#section3">References</a></span> for details on the algorithm and math behind it.</p></dd>
<dt><a name="27"><b class="cmd">::math::geometry::polylinesIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i></a></dt>
<dd><p>Check if two polylines intersect or not (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">polyline1</i></dt>
<dd><p>First polyline</p></dd>
<dt>list <i class="arg">polyline2</i></dt>
<dd><p>Second polyline</p></dd>
</dl></dd>
<dt><a name="28"><b class="cmd">::math::geometry::polylinesBoundingIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i> <i class="arg">granularity</i></a></dt>
<dd><p>Check whether two polylines intersect, but reduce
the correctness of the result to the given granularity.
Use this for faster, but weaker, intersection checking.</p>
<p>How it works:</p>
<p>Each polyline is split into a number of smaller polylines,
consisting of granularity points each. If a pair of those smaller
lines' bounding boxes intersect, then this procedure returns 1,
otherwise it returns 0.</p>
<dl class="arguments">
<dt>list <i class="arg">polyline1</i></dt>
<dd><p>First polyline</p></dd>
<dt>list <i class="arg">polyline2</i></dt>
<dd><p>Second polyline</p></dd>
<dt>int <i class="arg">granularity</i></dt>
<dd><p>Number of points in each part (&lt;=1 means check
every edge)</p></dd>
</dl></dd>
<dt><a name="29"><b class="cmd">::math::geometry::intervalsOverlap</b> <i class="arg">y1</i> <i class="arg">y2</i> <i class="arg">y3</i> <i class="arg">y4</i> <i class="arg">strict</i></a></dt>
<dd><p>Check if two intervals overlap.</p>
<dl class="arguments">
<dt>double <i class="arg">y1,y2</i></dt>
<dd><p>Begin and end of first interval</p></dd>
<dt>double <i class="arg">y3,y4</i></dt>
<dd><p>Begin and end of second interval</p></dd>
<dt>logical <i class="arg">strict</i></dt>
<dd><p>Check for strict or non-strict overlap</p></dd>
</dl></dd>
<dt><a name="30"><b class="cmd">::math::geometry::rectanglesOverlap</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">Q1</i> <i class="arg">Q2</i> <i class="arg">strict</i></a></dt>
<dd><p>Check if two rectangles overlap.</p>
<dl class="arguments">
<dt>list <i class="arg">P1</i></dt>
<dd><p>upper-left corner of the first rectangle</p></dd>
<dt>list <i class="arg">P2</i></dt>
<dd><p>lower-right corner of the first rectangle</p></dd>
<dt>list <i class="arg">Q1</i></dt>
<dd><p>upper-left corner of the second rectangle</p></dd>
<dt>list <i class="arg">Q2</i></dt>
<dd><p>lower-right corner of the second rectangle</p></dd>
<dt>list <i class="arg">strict</i></dt>
<dd><p>choosing strict or non-strict interpretation</p></dd>
</dl></dd>
<dt><a name="31"><b class="cmd">::math::geometry::bbox</b> <i class="arg">polyline</i></a></dt>
<dd><p>Calculate the bounding box of a polyline. Returns a list of four
coordinates: the upper-left and the lower-right corner of the box.</p>
<dl class="arguments">
<dt>list <i class="arg">polyline</i></dt>
<dd><p>The polyline to be examined</p></dd>
</dl></dd>
<dt><a name="32"><b class="cmd">::math::geometry::pointInsidePolygon</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt>
<dd><p>Determine if a point is completely inside a polygon. If the point
touches the polygon, then the point is not completely inside the
polygon.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>Coordinates of the point</p></dd>
<dt>list <i class="arg">polyline</i></dt>
<dd><p>The polyline to be examined</p></dd>
</dl></dd>
<dt><a name="33"><b class="cmd">::math::geometry::rectangleInsidePolygon</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">polyline</i></a></dt>
<dd><p>Determine if a rectangle is completely inside a polygon. If polygon
touches the rectangle, then the rectangle is not complete inside the
polygon.</p>
<dl class="arguments">
<dt>list <i class="arg">P1</i></dt>
<dd><p>Upper-left corner of the rectangle</p></dd>
<dt>list <i class="arg">P2</i></dt>
<dd><p>Lower-right corner of the rectangle</p></dd>
<dt>list <i class="arg">polygon</i></dt>
<dd><p>The polygon in question</p></dd>
</dl></dd>
<dt><a name="34"><b class="cmd">::math::geometry::areaPolygon</b> <i class="arg">polygon</i></a></dt>
<dd><p>Calculate the area of a polygon.</p>
<dl class="arguments">
<dt>list <i class="arg">polygon</i></dt>
<dd><p>The polygon in question</p></dd>
</dl></dd>
</dl>
</div>







|







<
<
<
<
<
<
<
<
<
<
<
|








|









|








|






|











|

|
<






|









|










|







|

















|









|













|






|









|











|







285
286
287
288
289
290
291
292
293
294
295
296
297
298
299











300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349

350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">linesegment</i></dt>
<dd><p>List of four numbers, the coordinates of the
first and last points of the line segment</p></dd>
</dl></dd>
<dt><a name="17"><b class="cmd">::math::geometry::calculateDistanceToPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt>
<dd><p>Calculate the distance of point P to the polyline and
return the result.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">polyline</i></dt>
<dd><p>List of numbers, the coordinates of the
vertices of the polyline</p></dd>
</dl></dd>











<dt><a name="18"><b class="cmd">::math::geometry::findClosestPointOnLine</b> <i class="arg">P</i> <i class="arg">line</i></a></dt>
<dd><p>Return the point on a line which is closest to a given point.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">line</i></dt>
<dd><p>List of four numbers, the coordinates of two points
on the line</p></dd>
</dl></dd>
<dt><a name="19"><b class="cmd">::math::geometry::findClosestPointOnLineSegment</b> <i class="arg">P</i> <i class="arg">linesegment</i></a></dt>
<dd><p>Return the point on a <em>line segment</em> which is closest to a given
point.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">linesegment</i></dt>
<dd><p>List of four numbers, the first and last
points on the line segment</p></dd>
</dl></dd>
<dt><a name="20"><b class="cmd">::math::geometry::findClosestPointOnPolyline</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt>
<dd><p>Return the point on a <em>polyline</em> which is closest to a given
point.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>List of two numbers, the coordinates of the point</p></dd>
<dt>list <i class="arg">polyline</i></dt>
<dd><p>List of numbers, the vertices of the polyline</p></dd>
</dl></dd>
<dt><a name="21"><b class="cmd">::math::geometry::lengthOfPolyline</b> <i class="arg">polyline</i></a></dt>
<dd><p>Return the length of the <em>polyline</em> (note: it not regarded as a
polygon)</p>
<dl class="arguments">
<dt>list <i class="arg">polyline</i></dt>
<dd><p>List of numbers, the vertices of the polyline</p></dd>
</dl></dd>
<dt><a name="22"><b class="cmd">::math::geometry::movePointInDirection</b> <i class="arg">P</i> <i class="arg">direction</i> <i class="arg">dist</i></a></dt>
<dd><p>Move a point over a given distance in a given direction and return the
new coordinates (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>Coordinates of the point to be moved</p></dd>
<dt>double <i class="arg">direction</i></dt>
<dd><p>Direction (in degrees; 0 is to the right, 90
upwards)</p></dd>
<dt>list <i class="arg">dist</i></dt>
<dd><p>Distance over which to move the point</p></dd>
</dl></dd>
<dt><a name="23"><b class="cmd">::math::geometry::lineSegmentsIntersect</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></dt>
<dd><p>Check if two line segments intersect or coincide. Returns 1 if that is
the case, 0 otherwise (in two dimensions only).</p>

<dl class="arguments">
<dt>list <i class="arg">linesegment1</i></dt>
<dd><p>First line segment</p></dd>
<dt>list <i class="arg">linesegment2</i></dt>
<dd><p>Second line segment</p></dd>
</dl></dd>
<dt><a name="24"><b class="cmd">::math::geometry::findLineSegmentIntersection</b> <i class="arg">linesegment1</i> <i class="arg">linesegment2</i></a></dt>
<dd><p>Find the intersection point of two line segments. Return the coordinates
or the keywords &quot;coincident&quot; or &quot;none&quot; if the line segments coincide or
have no points in common (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">linesegment1</i></dt>
<dd><p>First line segment</p></dd>
<dt>list <i class="arg">linesegment2</i></dt>
<dd><p>Second line segment</p></dd>
</dl></dd>
<dt><a name="25"><b class="cmd">::math::geometry::findLineIntersection</b> <i class="arg">line1</i> <i class="arg">line2</i></a></dt>
<dd><p>Find the intersection point of two (infinite) lines. Return the coordinates
or the keywords &quot;coincident&quot; or &quot;none&quot; if the lines coincide or
have no points in common (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">line1</i></dt>
<dd><p>First line</p></dd>
<dt>list <i class="arg">line2</i></dt>
<dd><p>Second line</p></dd>
</dl>
<p>See section <span class="sectref"><a href="#section3">References</a></span> for details on the algorithm and math behind it.</p></dd>
<dt><a name="26"><b class="cmd">::math::geometry::polylinesIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i></a></dt>
<dd><p>Check if two polylines intersect or not (in two dimensions only).</p>
<dl class="arguments">
<dt>list <i class="arg">polyline1</i></dt>
<dd><p>First polyline</p></dd>
<dt>list <i class="arg">polyline2</i></dt>
<dd><p>Second polyline</p></dd>
</dl></dd>
<dt><a name="27"><b class="cmd">::math::geometry::polylinesBoundingIntersect</b> <i class="arg">polyline1</i> <i class="arg">polyline2</i> <i class="arg">granularity</i></a></dt>
<dd><p>Check whether two polylines intersect, but reduce
the correctness of the result to the given granularity.
Use this for faster, but weaker, intersection checking.</p>
<p>How it works:</p>
<p>Each polyline is split into a number of smaller polylines,
consisting of granularity points each. If a pair of those smaller
lines' bounding boxes intersect, then this procedure returns 1,
otherwise it returns 0.</p>
<dl class="arguments">
<dt>list <i class="arg">polyline1</i></dt>
<dd><p>First polyline</p></dd>
<dt>list <i class="arg">polyline2</i></dt>
<dd><p>Second polyline</p></dd>
<dt>int <i class="arg">granularity</i></dt>
<dd><p>Number of points in each part (&lt;=1 means check
every edge)</p></dd>
</dl></dd>
<dt><a name="28"><b class="cmd">::math::geometry::intervalsOverlap</b> <i class="arg">y1</i> <i class="arg">y2</i> <i class="arg">y3</i> <i class="arg">y4</i> <i class="arg">strict</i></a></dt>
<dd><p>Check if two intervals overlap.</p>
<dl class="arguments">
<dt>double <i class="arg">y1,y2</i></dt>
<dd><p>Begin and end of first interval</p></dd>
<dt>double <i class="arg">y3,y4</i></dt>
<dd><p>Begin and end of second interval</p></dd>
<dt>logical <i class="arg">strict</i></dt>
<dd><p>Check for strict or non-strict overlap</p></dd>
</dl></dd>
<dt><a name="29"><b class="cmd">::math::geometry::rectanglesOverlap</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">Q1</i> <i class="arg">Q2</i> <i class="arg">strict</i></a></dt>
<dd><p>Check if two rectangles overlap.</p>
<dl class="arguments">
<dt>list <i class="arg">P1</i></dt>
<dd><p>upper-left corner of the first rectangle</p></dd>
<dt>list <i class="arg">P2</i></dt>
<dd><p>lower-right corner of the first rectangle</p></dd>
<dt>list <i class="arg">Q1</i></dt>
<dd><p>upper-left corner of the second rectangle</p></dd>
<dt>list <i class="arg">Q2</i></dt>
<dd><p>lower-right corner of the second rectangle</p></dd>
<dt>list <i class="arg">strict</i></dt>
<dd><p>choosing strict or non-strict interpretation</p></dd>
</dl></dd>
<dt><a name="30"><b class="cmd">::math::geometry::bbox</b> <i class="arg">polyline</i></a></dt>
<dd><p>Calculate the bounding box of a polyline. Returns a list of four
coordinates: the upper-left and the lower-right corner of the box.</p>
<dl class="arguments">
<dt>list <i class="arg">polyline</i></dt>
<dd><p>The polyline to be examined</p></dd>
</dl></dd>
<dt><a name="31"><b class="cmd">::math::geometry::pointInsidePolygon</b> <i class="arg">P</i> <i class="arg">polyline</i></a></dt>
<dd><p>Determine if a point is completely inside a polygon. If the point
touches the polygon, then the point is not completely inside the
polygon.</p>
<dl class="arguments">
<dt>list <i class="arg">P</i></dt>
<dd><p>Coordinates of the point</p></dd>
<dt>list <i class="arg">polyline</i></dt>
<dd><p>The polyline to be examined</p></dd>
</dl></dd>
<dt><a name="32"><b class="cmd">::math::geometry::rectangleInsidePolygon</b> <i class="arg">P1</i> <i class="arg">P2</i> <i class="arg">polyline</i></a></dt>
<dd><p>Determine if a rectangle is completely inside a polygon. If polygon
touches the rectangle, then the rectangle is not complete inside the
polygon.</p>
<dl class="arguments">
<dt>list <i class="arg">P1</i></dt>
<dd><p>Upper-left corner of the rectangle</p></dd>
<dt>list <i class="arg">P2</i></dt>
<dd><p>Lower-right corner of the rectangle</p></dd>
<dt>list <i class="arg">polygon</i></dt>
<dd><p>The polygon in question</p></dd>
</dl></dd>
<dt><a name="33"><b class="cmd">::math::geometry::areaPolygon</b> <i class="arg">polygon</i></a></dt>
<dd><p>Calculate the area of a polygon.</p>
<dl class="arguments">
<dt>list <i class="arg">polygon</i></dt>
<dd><p>The polygon in question</p></dd>
</dl></dd>
</dl>
</div>
Changes to embedded/www/tcllib/files/modules/pt/pt_peg_from_peg.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt::peg::from::peg(n) 1.0.2 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt::peg::from::peg - PEG Conversion. Read PEG format</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt::peg::from::peg(n) 1 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt::peg::from::peg - PEG Conversion. Read PEG format</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::peg::from::peg <span class="opt">?1.0.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">pt::peg::from::peg</b> <b class="method">convert</b> <i class="arg">text</i></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>







|







139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::peg::from::peg <span class="opt">?1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">pt::peg::from::peg</b> <b class="method">convert</b> <i class="arg">text</i></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
Changes to embedded/www/tcllib/files/modules/pt/pt_peg_op.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt_peg_op(i) 1.0.1 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt_peg_op - Parser Tools PE Grammar Utility Operations</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
<li class="section"><a href="#section3">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::peg::op 1.0.1</b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::peg::peg::op</b> <b class="method">called</b> <i class="arg">container</i></a></li>
<li><a href="#2"><b class="cmd">::peg::peg::op</b> <b class="method">dechain</b> <i class="arg">container</i></a></li>
<li><a href="#3"><b class="cmd">::peg::peg::op</b> <b class="method">drop unreachable</b> <i class="arg">container</i></a></li>
<li><a href="#4"><b class="cmd">::peg::peg::op</b> <b class="method">drop unrealizable</b> <i class="arg">container</i></a></li>
<li><a href="#5"><b class="cmd">::peg::peg::op</b> <b class="method">flatten</b> <i class="arg">container</i></a></li>







|



















|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt_peg_op(i) 1 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt_peg_op - Parser Tools PE Grammar Utility Operations</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
<li class="section"><a href="#section3">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::peg::op 1</b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::peg::peg::op</b> <b class="method">called</b> <i class="arg">container</i></a></li>
<li><a href="#2"><b class="cmd">::peg::peg::op</b> <b class="method">dechain</b> <i class="arg">container</i></a></li>
<li><a href="#3"><b class="cmd">::peg::peg::op</b> <b class="method">drop unreachable</b> <i class="arg">container</i></a></li>
<li><a href="#4"><b class="cmd">::peg::peg::op</b> <b class="method">drop unrealizable</b> <i class="arg">container</i></a></li>
<li><a href="#5"><b class="cmd">::peg::peg::op</b> <b class="method">flatten</b> <i class="arg">container</i></a></li>
Changes to embedded/www/tcllib/files/modules/pt/pt_peg_to_peg.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt::peg::to::peg(n) 1.0.1 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt::peg::to::peg - PEG Conversion. Write PEG format</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt::peg::to::peg(n) 1 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt::peg::to::peg - PEG Conversion. Write PEG format</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::peg::to::peg <span class="opt">?1.0.1?</span></b></li>
<li>package require <b class="pkgname">pt::peg</b></li>
<li>package require <b class="pkgname">pt::pe</b></li>
<li>package require <b class="pkgname">text::write</b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">pt::peg::to::peg</b> <b class="method">reset</b></a></li>
<li><a href="#2"><b class="cmd">pt::peg::to::peg</b> <b class="method">configure</b></a></li>







|







140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::peg::to::peg <span class="opt">?1?</span></b></li>
<li>package require <b class="pkgname">pt::peg</b></li>
<li>package require <b class="pkgname">pt::pe</b></li>
<li>package require <b class="pkgname">text::write</b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">pt::peg::to::peg</b> <b class="method">reset</b></a></li>
<li><a href="#2"><b class="cmd">pt::peg::to::peg</b> <b class="method">configure</b></a></li>
Changes to embedded/www/tcllib/files/modules/pt/pt_pgen.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt::pgen(n) 1.0.2 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt::pgen - Parser Generator</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
<li class="section"><a href="#section3">Example</a></li>
<li class="section"><a href="#section4">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::pgen <span class="opt">?1.0.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::pt::pgen</b> <i class="arg">inputformat</i> <i class="arg">text</i> <i class="arg">resultformat</i> <span class="opt">?<i class="arg">options...</i>?</span></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>







|




















|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">pt::pgen(n) 1.0.1 tcllib &quot;Parser Tools&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>pt::pgen - Parser Generator</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
<li class="section"><a href="#section3">Example</a></li>
<li class="section"><a href="#section4">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">pt::pgen <span class="opt">?1.0.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::pt::pgen</b> <i class="arg">inputformat</i> <i class="arg">text</i> <i class="arg">resultformat</i> <span class="opt">?<i class="arg">options...</i>?</span></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
Changes to embedded/www/tcllib/files/modules/rest/rest.html.
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">rest(n) 1.0.1 tcllib &quot;A framework for RESTful web services&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>rest - define REST web APIs and call them inline or asychronously</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">INCLUDED</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">rest <span class="opt">?1.0.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::rest::simple</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#2"><b class="cmd">::rest::get</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#3"><b class="cmd">::rest::post</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#4"><b class="cmd">::rest::head</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#5"><b class="cmd">::rest::put</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>







|















|







102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">rest(n) 1.0 tcllib &quot;A framework for RESTful web services&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>rest - define REST web APIs and call them inline or asychronously</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">INCLUDED</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.5</b></li>
<li>package require <b class="pkgname">rest <span class="opt">?1.0?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::rest::simple</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#2"><b class="cmd">::rest::get</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#3"><b class="cmd">::rest::post</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#4"><b class="cmd">::rest::head</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
<li><a href="#5"><b class="cmd">::rest::put</b> <i class="arg">url</i> <i class="arg">query</i> <span class="opt">?config?</span> <span class="opt">?body?</span></a></li>
Changes to embedded/www/tcllib/files/modules/struct/struct_list.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">struct::list(n) 1.8.3 tcllib &quot;Tcl Data Structures&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>struct::list - Procedures for manipulating lists</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">struct::list(n) 1.8.2 tcllib &quot;Tcl Data Structures&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>struct::list - Procedures for manipulating lists</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">struct::list <span class="opt">?1.8.3?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::struct::list</b> <b class="method">longestCommonSubsequence</b> <i class="arg">sequence1</i> <i class="arg">sequence2</i> <span class="opt">?<i class="arg">maxOccurs</i>?</span></a></li>
<li><a href="#2"><b class="cmd">::struct::list</b> <b class="method">longestCommonSubsequence2</b> <i class="arg">sequence1 sequence2</i> <span class="opt">?<i class="arg">maxOccurs</i>?</span></a></li>
<li><a href="#3"><b class="cmd">::struct::list</b> <b class="method">lcsInvert</b> <i class="arg">lcsData</i> <i class="arg">len1</i> <i class="arg">len2</i></a></li>
<li><a href="#4"><b class="cmd">::struct::list</b> <b class="method">lcsInvert2</b> <i class="arg">lcs1</i> <i class="arg">lcs2</i> <i class="arg">len1</i> <i class="arg">len2</i></a></li>
<li><a href="#5"><b class="cmd">::struct::list</b> <b class="method">lcsInvertMerge</b> <i class="arg">lcsData</i> <i class="arg">len1</i> <i class="arg">len2</i></a></li>







|







127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">struct::list <span class="opt">?1.8.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::struct::list</b> <b class="method">longestCommonSubsequence</b> <i class="arg">sequence1</i> <i class="arg">sequence2</i> <span class="opt">?<i class="arg">maxOccurs</i>?</span></a></li>
<li><a href="#2"><b class="cmd">::struct::list</b> <b class="method">longestCommonSubsequence2</b> <i class="arg">sequence1 sequence2</i> <span class="opt">?<i class="arg">maxOccurs</i>?</span></a></li>
<li><a href="#3"><b class="cmd">::struct::list</b> <b class="method">lcsInvert</b> <i class="arg">lcsData</i> <i class="arg">len1</i> <i class="arg">len2</i></a></li>
<li><a href="#4"><b class="cmd">::struct::list</b> <b class="method">lcsInvert2</b> <i class="arg">lcs1</i> <i class="arg">lcs2</i> <i class="arg">len1</i> <i class="arg">len2</i></a></li>
<li><a href="#5"><b class="cmd">::struct::list</b> <b class="method">lcsInvertMerge</b> <i class="arg">lcsData</i> <i class="arg">len1</i> <i class="arg">len2</i></a></li>
Changes to embedded/www/tcllib/files/modules/tar/tar.html.
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">tar(n) 0.10 tcllib &quot;Tar file handling&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>tar - Tar file creation, extraction &amp; manipulation</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">tar <span class="opt">?0.10?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::tar::contents</b> <i class="arg">tarball</i> <span class="opt">?<b class="option">-chan</b>?</span></a></li>
<li><a href="#2"><b class="cmd">::tar::stat</b> <i class="arg">tarball</i> <span class="opt">?file?</span> <span class="opt">?<b class="option">-chan</b>?</span></a></li>
<li><a href="#3"><b class="cmd">::tar::untar</b> <i class="arg">tarball</i> <i class="arg">args</i></a></li>
<li><a href="#4"><b class="cmd">::tar::get</b> <i class="arg">tarball</i> <i class="arg">fileName</i> <span class="opt">?<b class="option">-chan</b>?</span></a></li>
<li><a href="#5"><b class="cmd">::tar::create</b> <i class="arg">tarball</i> <i class="arg">files</i> <i class="arg">args</i></a></li>







|

















|







102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">tar(n) 0.9 tcllib &quot;Tar file handling&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>tar - Tar file creation, extraction &amp; manipulation</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">tar <span class="opt">?0.9?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::tar::contents</b> <i class="arg">tarball</i> <span class="opt">?<b class="option">-chan</b>?</span></a></li>
<li><a href="#2"><b class="cmd">::tar::stat</b> <i class="arg">tarball</i> <span class="opt">?file?</span> <span class="opt">?<b class="option">-chan</b>?</span></a></li>
<li><a href="#3"><b class="cmd">::tar::untar</b> <i class="arg">tarball</i> <i class="arg">args</i></a></li>
<li><a href="#4"><b class="cmd">::tar::get</b> <i class="arg">tarball</i> <i class="arg">fileName</i> <span class="opt">?<b class="option">-chan</b>?</span></a></li>
<li><a href="#5"><b class="cmd">::tar::create</b> <i class="arg">tarball</i> <i class="arg">files</i> <i class="arg">args</i></a></li>
Changes to embedded/www/tcllib/files/modules/term/ansi_cctrl.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">term::ansi::code::ctrl(n) 0.2 tcllib &quot;Terminal control&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>term::ansi::code::ctrl - ANSI control sequences</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>







|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">term::ansi::code::ctrl(n) 0.1 tcllib &quot;Terminal control&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>term::ansi::code::ctrl - ANSI control sequences</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">term::ansi::code <span class="opt">?0.2?</span></b></li>
<li>package require <b class="pkgname">term::ansi::code::ctrl <span class="opt">?0.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::term::ansi::code::ctrl::names</b></a></li>
<li><a href="#2"><b class="cmd">::term::ansi::code::ctrl::import</b> <span class="opt">?<i class="arg">ns</i>?</span> <span class="opt">?<i class="arg">arg</i>...?</span></a></li>
<li><a href="#3"><b class="cmd">::term::ansi::code::ctrl::eeol</b></a></li>
<li><a href="#4"><b class="cmd">::term::ansi::code::ctrl::esol</b></a></li>
<li><a href="#5"><b class="cmd">::term::ansi::code::ctrl::el</b></a></li>







|
|







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">term::ansi::code <span class="opt">?0.1?</span></b></li>
<li>package require <b class="pkgname">term::ansi::code::ctrl <span class="opt">?0.1.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::term::ansi::code::ctrl::names</b></a></li>
<li><a href="#2"><b class="cmd">::term::ansi::code::ctrl::import</b> <span class="opt">?<i class="arg">ns</i>?</span> <span class="opt">?<i class="arg">arg</i>...?</span></a></li>
<li><a href="#3"><b class="cmd">::term::ansi::code::ctrl::eeol</b></a></li>
<li><a href="#4"><b class="cmd">::term::ansi::code::ctrl::esol</b></a></li>
<li><a href="#5"><b class="cmd">::term::ansi::code::ctrl::el</b></a></li>
Changes to embedded/www/tcllib/files/modules/term/ansi_code.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">term::ansi::code(n) 0.2 tcllib &quot;Terminal control&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>term::ansi::code - Helper for control sequences</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">term::ansi::code <span class="opt">?0.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::term::ansi::code::esc</b> <i class="arg">str</i></a></li>
<li><a href="#2"><b class="cmd">::term::ansi::code::escb</b> <i class="arg">str</i></a></li>
<li><a href="#3"><b class="cmd">::term::ansi::code::define</b> <i class="arg">name</i> <i class="arg">escape</i> <i class="arg">code</i></a></li>
<li><a href="#4"><b class="cmd">::term::ansi::code::const</b> <i class="arg">name</i> <i class="arg">code</i></a></li>
</ul>







|


















|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">term::ansi::code(n) 0.1 tcllib &quot;Terminal control&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>term::ansi::code - Helper for control sequences</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">term::ansi::code <span class="opt">?0.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::term::ansi::code::esc</b> <i class="arg">str</i></a></li>
<li><a href="#2"><b class="cmd">::term::ansi::code::escb</b> <i class="arg">str</i></a></li>
<li><a href="#3"><b class="cmd">::term::ansi::code::define</b> <i class="arg">name</i> <i class="arg">escape</i> <i class="arg">code</i></a></li>
<li><a href="#4"><b class="cmd">::term::ansi::code::const</b> <i class="arg">name</i> <i class="arg">code</i></a></li>
</ul>
Changes to embedded/www/tcllib/files/modules/term/ansi_send.html.
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">term::ansi::send(n) 0.2 tcllib &quot;Terminal control&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>term::ansi::send - Output of ANSI control sequences to terminals</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">term::ansi::send <span class="opt">?0.2?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::term::ansi::send::import</b> <span class="opt">?<i class="arg">ns</i>?</span> <i class="arg">...</i></a></li>
<li><a href="#2"><b class="cmd">::term::ansi::send::eeol</b></a></li>
<li><a href="#3"><b class="cmd">::term::ansi::send::esol</b></a></li>
<li><a href="#4"><b class="cmd">::term::ansi::send::el</b></a></li>
<li><a href="#5"><b class="cmd">::term::ansi::send::ed</b></a></li>







|


















|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">term::ansi::send(n) 0.1 tcllib &quot;Terminal control&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>term::ansi::send - Output of ANSI control sequences to terminals</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
<li class="section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">term::ansi::send <span class="opt">?0.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::term::ansi::send::import</b> <span class="opt">?<i class="arg">ns</i>?</span> <i class="arg">...</i></a></li>
<li><a href="#2"><b class="cmd">::term::ansi::send::eeol</b></a></li>
<li><a href="#3"><b class="cmd">::term::ansi::send::esol</b></a></li>
<li><a href="#4"><b class="cmd">::term::ansi::send::el</b></a></li>
<li><a href="#5"><b class="cmd">::term::ansi::send::ed</b></a></li>
Changes to embedded/www/tcllib/files/modules/textutil/textutil.html.
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">textutil(n) 0.8 tcllib &quot;Text and string utilities, macro processing&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>textutil - Procedures to manipulate texts and strings.</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">textutil <span class="opt">?0.8?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::textutil::adjust</b> <i class="arg">string args</i></a></li>
<li><a href="#2"><b class="cmd">::textutil::adjust::readPatterns</b> <i class="arg">filename</i></a></li>
<li><a href="#3"><b class="cmd">::textutil::adjust::listPredefined</b></a></li>
<li><a href="#4"><b class="cmd">::textutil::adjust::getPredefined</b> <i class="arg">filename</i></a></li>
<li><a href="#5"><b class="cmd">::textutil::indent</b> <i class="arg">string</i> <i class="arg">prefix</i> <span class="opt">?<i class="arg">skip</i>?</span></a></li>







|


















|







101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">textutil(n) 0.7.1 tcllib &quot;Text and string utilities, macro processing&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>textutil - Procedures to manipulate texts and strings.</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">textutil <span class="opt">?0.7.1?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::textutil::adjust</b> <i class="arg">string args</i></a></li>
<li><a href="#2"><b class="cmd">::textutil::adjust::readPatterns</b> <i class="arg">filename</i></a></li>
<li><a href="#3"><b class="cmd">::textutil::adjust::listPredefined</b></a></li>
<li><a href="#4"><b class="cmd">::textutil::adjust::getPredefined</b> <i class="arg">filename</i></a></li>
<li><a href="#5"><b class="cmd">::textutil::indent</b> <i class="arg">string</i> <i class="arg">prefix</i> <span class="opt">?<i class="arg">skip</i>?</span></a></li>
Changes to embedded/www/tcllib/files/modules/textutil/textutil_string.html.
1
2
3
4
5
6
7
8

<html><head>
<title>textutil::string - Text and string utilities, macro processing</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
<








1
2
3
4
5
6
7

<html><head>
<title>textutil::string - Text and string utilities, macro processing</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">textutil::string(n) 0.8 tcllib &quot;Text and string utilities, macro processing&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>textutil::string - Procedures to manipulate texts and strings.</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">textutil::string <span class="opt">?0.8?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::textutil::string::chop</b> <i class="arg">string</i></a></li>
<li><a href="#2"><b class="cmd">::textutil::string::tail</b> <i class="arg">string</i></a></li>
<li><a href="#3"><b class="cmd">::textutil::string::cap</b> <i class="arg">string</i></a></li>
<li><a href="#4"><b class="cmd">::textutil::string::capEachWord</b> <i class="arg">string</i></a></li>
<li><a href="#5"><b class="cmd">::textutil::string::uncap</b> <i class="arg">string</i></a></li>
<li><a href="#6"><b class="cmd">::textutil::string::longestCommonPrefixList</b> <i class="arg">list</i></a></li>
<li><a href="#7"><b class="cmd">::textutil::string::longestCommonPrefix</b> <span class="opt">?<i class="arg">string</i>...?</span></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
<p>The package <b class="package">textutil::string</b> provides miscellaneous string
manipulation commands.</p>
<p>The complete set of procedures is described below.</p>
<dl class="definitions">
<dt><a name="1"><b class="cmd">::textutil::string::chop</b> <i class="arg">string</i></a></dt>
<dd><p>A convenience command. Removes the last character of <i class="arg">string</i> and
returns the shortened string.</p></dd>
<dt><a name="2"><b class="cmd">::textutil::string::tail</b> <i class="arg">string</i></a></dt>
<dd><p>A convenience command. Removes the first character of <i class="arg">string</i> and
returns the shortened string.</p></dd>
<dt><a name="3"><b class="cmd">::textutil::string::cap</b> <i class="arg">string</i></a></dt>
<dd><p>Capitalizes the first character of <i class="arg">string</i> and returns the
modified string.</p></dd>
<dt><a name="4"><b class="cmd">::textutil::string::capEachWord</b> <i class="arg">string</i></a></dt>
<dd><p>Capitalizes the first character of word of the <i class="arg">string</i> and
returns the modified string. Words quoted with either backslash or
dollar-sign are left untouched.</p></dd>
<dt><a name="5"><b class="cmd">::textutil::string::uncap</b> <i class="arg">string</i></a></dt>
<dd><p>The complementary operation to <b class="cmd">::textutil::string::cap</b>. Forces
the first character of <i class="arg">string</i> to lower case and returns the
modified string.</p></dd>
<dt><a name="6"><b class="cmd">::textutil::string::longestCommonPrefixList</b> <i class="arg">list</i></a></dt>
<dd></dd>
<dt><a name="7"><b class="cmd">::textutil::string::longestCommonPrefix</b> <span class="opt">?<i class="arg">string</i>...?</span></a></dt>
<dd><p>Computes the longest common prefix for either the <i class="arg">string</i>s given
to the command, or the strings specified in the single <i class="arg">list</i>, and
returns it as the result of the command.</p>
<p>If no strings were specified the result is the empty string.  If only
one string was specified, the string itself is returned, as it is its
own longest common prefix.</p></dd>
</dl>







|


















|





<
|
|
|

















<
<
<
<
|



|

|







101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152




153
154
155
156
157
158
159
160
161
162
163
164
165
166
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">textutil::string(n) 0.7 tcllib &quot;Text and string utilities, macro processing&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>textutil::string - Procedures to manipulate texts and strings.</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">Bugs, Ideas, Feedback</a></li>
<li class="section"><a href="#see-also">See Also</a></li>
<li class="section"><a href="#keywords">Keywords</a></li>
<li class="section"><a href="#category">Category</a></li>
</ul>
</div>
<div id="synopsis" class="section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.2</b></li>
<li>package require <b class="pkgname">textutil::string <span class="opt">?0.7?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::textutil::string::chop</b> <i class="arg">string</i></a></li>
<li><a href="#2"><b class="cmd">::textutil::string::tail</b> <i class="arg">string</i></a></li>
<li><a href="#3"><b class="cmd">::textutil::string::cap</b> <i class="arg">string</i></a></li>

<li><a href="#4"><b class="cmd">::textutil::string::uncap</b> <i class="arg">string</i></a></li>
<li><a href="#5"><b class="cmd">::textutil::string::longestCommonPrefixList</b> <i class="arg">list</i></a></li>
<li><a href="#6"><b class="cmd">::textutil::string::longestCommonPrefix</b> <span class="opt">?<i class="arg">string</i>...?</span></a></li>
</ul>
</div>
</div>
<div id="section1" class="section"><h2><a name="section1">Description</a></h2>
<p>The package <b class="package">textutil::string</b> provides miscellaneous string
manipulation commands.</p>
<p>The complete set of procedures is described below.</p>
<dl class="definitions">
<dt><a name="1"><b class="cmd">::textutil::string::chop</b> <i class="arg">string</i></a></dt>
<dd><p>A convenience command. Removes the last character of <i class="arg">string</i> and
returns the shortened string.</p></dd>
<dt><a name="2"><b class="cmd">::textutil::string::tail</b> <i class="arg">string</i></a></dt>
<dd><p>A convenience command. Removes the first character of <i class="arg">string</i> and
returns the shortened string.</p></dd>
<dt><a name="3"><b class="cmd">::textutil::string::cap</b> <i class="arg">string</i></a></dt>
<dd><p>Capitalizes the first character of <i class="arg">string</i> and returns the
modified string.</p></dd>




<dt><a name="4"><b class="cmd">::textutil::string::uncap</b> <i class="arg">string</i></a></dt>
<dd><p>The complementary operation to <b class="cmd">::textutil::string::cap</b>. Forces
the first character of <i class="arg">string</i> to lower case and returns the
modified string.</p></dd>
<dt><a name="5"><b class="cmd">::textutil::string::longestCommonPrefixList</b> <i class="arg">list</i></a></dt>
<dd></dd>
<dt><a name="6"><b class="cmd">::textutil::string::longestCommonPrefix</b> <span class="opt">?<i class="arg">string</i>...?</span></a></dt>
<dd><p>Computes the longest common prefix for either the <i class="arg">string</i>s given
to the command, or the strings specified in the single <i class="arg">list</i>, and
returns it as the result of the command.</p>
<p>If no strings were specified the result is the empty string.  If only
one string was specified, the string itself is returned, as it is its
own longest common prefix.</p></dd>
</dl>
Changes to embedded/www/tcllib/files/modules/zip/decode.html.
1
2
3
4
5
6
7
8
9
10

<html><head>
<title>zipfile::decode - Zip archive handling</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
    BODY {
	background: 	#FFFFFF;


|







1
2
3
4
5
6
7
8
9
10

<html><head>
<title>zipfile::encode - Zip archive handling</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
    BODY {
	background: 	#FFFFFF;
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
	margin-bottom: 	1em;
	border-bottom:	1px solid black;
    }
--></style>
</head>
<! -- Generated from file 'decode.man' by tcllib/doctools with format 'html'
   -->
<! -- Copyright &copy; 2008-2014 Andreas Kupries
   -->
<! -- CVS: $Id$ zipfile::decode.n
   -->
<body><div class="doctools">
<hr> [
   <a href="../../../../../../../../home">Tcllib Home</a>
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">zipfile::decode(n) 0.5 tcllib &quot;Zip archive handling&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>zipfile::decode - Access to zip archives</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>







|

|











|

|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
	margin-bottom: 	1em;
	border-bottom:	1px solid black;
    }
--></style>
</head>
<! -- Generated from file 'decode.man' by tcllib/doctools with format 'html'
   -->
<! -- Copyright &copy; 2008-2012 Andreas Kupries
   -->
<! -- CVS: $Id$ zipfile::encode.n
   -->
<body><div class="doctools">
<hr> [
   <a href="../../../../../../../../home">Tcllib Home</a>
| <a href="../../../../toc.html">Main Table Of Contents</a>
| <a href="../../../toc.html">Table Of Contents</a>
| <a href="../../../../index.html">Keyword Index</a>
| <a href="../../../../toc0.html">Categories</a>
| <a href="../../../../toc1.html">Modules</a>
| <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<h1 class="title">zipfile::encode(n) 0.3 tcllib &quot;Zip archive handling&quot;</h1>
<div id="name" class="section"><h2><a name="name">Name</a></h2>
<p>zipfile::encode - Access to zip archives</p>
</div>
<div id="toc" class="section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="toc">
<li class="section"><a href="#toc">Table Of Contents</a></li>
<li class="section"><a href="#synopsis">Synopsis</a></li>
<li class="section"><a href="#section1">Description</a></li>
<li class="section"><a href="#section2">API</a></li>
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">fileutil::magic::mimetype</b></li>
<li>package require <b class="pkgname">fileutil::decode 0.2</b></li>
<li>package require <b class="pkgname">Trf</b></li>
<li>package require <b class="pkgname">zlibtcl</b></li>
<li>package require <b class="pkgname">zipfile::decode <span class="opt">?0.5?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::zipfile::decode::archive</b></a></li>
<li><a href="#2"><b class="cmd">::zipfile::decode::close</b></a></li>
<li><a href="#3"><b class="cmd">::zipfile::decode::comment</b> <i class="arg">adict</i></a></li>
<li><a href="#4"><b class="cmd">::zipfile::decode::content</b> <i class="arg">archive</i></a></li>
<li><a href="#5"><b class="cmd">::zipfile::decode::copyfile</b> <i class="arg">adict</i> <i class="arg">path</i> <i class="arg">dst</i></a></li>







|







128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<div class="synopsis">
<ul class="requirements">
<li>package require <b class="pkgname">Tcl 8.4</b></li>
<li>package require <b class="pkgname">fileutil::magic::mimetype</b></li>
<li>package require <b class="pkgname">fileutil::decode 0.2</b></li>
<li>package require <b class="pkgname">Trf</b></li>
<li>package require <b class="pkgname">zlibtcl</b></li>
<li>package require <b class="pkgname">zipfile::decode <span class="opt">?0.4?</span></b></li>
</ul>
<ul class="syntax">
<li><a href="#1"><b class="cmd">::zipfile::decode::archive</b></a></li>
<li><a href="#2"><b class="cmd">::zipfile::decode::close</b></a></li>
<li><a href="#3"><b class="cmd">::zipfile::decode::comment</b> <i class="arg">adict</i></a></li>
<li><a href="#4"><b class="cmd">::zipfile::decode::content</b> <i class="arg">archive</i></a></li>
<li><a href="#5"><b class="cmd">::zipfile::decode::copyfile</b> <i class="arg">adict</i> <i class="arg">path</i> <i class="arg">dst</i></a></li>
224
225
226
227
228
229
230
231
232
233
<div id="keywords" class="section"><h2><a name="keywords">Keywords</a></h2>
<p><a href="../../../../index.html#key43">decompression</a>, <a href="../../../../index.html#key42">zip</a></p>
</div>
<div id="category" class="section"><h2><a name="category">Category</a></h2>
<p>File</p>
</div>
<div id="copyright" class="section"><h2><a name="copyright">Copyright</a></h2>
<p>Copyright &copy; 2008-2014 Andreas Kupries</p>
</div>
</div></body></html>







|


224
225
226
227
228
229
230
231
232
233
<div id="keywords" class="section"><h2><a name="keywords">Keywords</a></h2>
<p><a href="../../../../index.html#key43">decompression</a>, <a href="../../../../index.html#key42">zip</a></p>
</div>
<div id="category" class="section"><h2><a name="category">Category</a></h2>
<p>File</p>
</div>
<div id="copyright" class="section"><h2><a name="copyright">Copyright</a></h2>
<p>Copyright &copy; 2008-2012 Andreas Kupries</p>
</div>
</div></body></html>
Changes to embedded/www/tcllib/toc.html.
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
<td class="#tocright">YAML Format Encoder/Decoder</td>
</tr>
<tr class="#toceven" >
<td class="#tocleft" ><a href="files/modules/base64/yencode.html">yencode</a></td>
<td class="#tocright">Y-encode/decode binary data</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="files/modules/zip/decode.html">zipfile::decode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#toceven" >
<td class="#tocleft" ><a href="files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table>







|







1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
<td class="#tocright">YAML Format Encoder/Decoder</td>
</tr>
<tr class="#toceven" >
<td class="#tocleft" ><a href="files/modules/base64/yencode.html">yencode</a></td>
<td class="#tocright">Y-encode/decode binary data</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="files/modules/zip/decode.html">zipfile::encode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#toceven" >
<td class="#tocleft" ><a href="files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table>
Changes to embedded/www/toc.html.
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
<td class="#tocleft" ><a href="tcllib/files/modules/textutil/expander.html">textutil::expander</a></td>
<td class="#tocright">Procedures to process templates and expand text.</td>
</tr>
</table></dl>
<dl><dt>File<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::decode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl>







|







531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
<td class="#tocleft" ><a href="tcllib/files/modules/textutil/expander.html">textutil::expander</a></td>
<td class="#tocright">Procedures to process templates and expand text.</td>
</tr>
</table></dl>
<dl><dt>File<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::encode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl>
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
<td class="#tocleft" ><a href="tcllib/files/modules/yaml/yaml.html">yaml</a></td>
<td class="#tocright">YAML Format Encoder/Decoder</td>
</tr>
</table></dl>
<dl><dt>zip<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::decode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl></table></dl></table></dl>
</dl><hr></body></html>







|








3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
<td class="#tocleft" ><a href="tcllib/files/modules/yaml/yaml.html">yaml</a></td>
<td class="#tocright">YAML Format Encoder/Decoder</td>
</tr>
</table></dl>
<dl><dt>zip<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::encode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl></table></dl></table></dl>
</dl><hr></body></html>
Changes to embedded/www/toc0.html.
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
<td class="#tocleft" ><a href="tcllib/files/modules/textutil/expander.html">textutil::expander</a></td>
<td class="#tocright">Procedures to process templates and expand text.</td>
</tr>
</table></dl>
<dl><dt>File<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::decode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl>







|







531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
<td class="#tocleft" ><a href="tcllib/files/modules/textutil/expander.html">textutil::expander</a></td>
<td class="#tocright">Procedures to process templates and expand text.</td>
</tr>
</table></dl>
<dl><dt>File<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::encode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl>
Changes to embedded/www/toc1.html.
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
<td class="#tocleft" ><a href="tcllib/files/modules/yaml/yaml.html">yaml</a></td>
<td class="#tocright">YAML Format Encoder/Decoder</td>
</tr>
</table></dl>
<dl><dt>zip<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::decode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl></table></dl>







|







1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
<td class="#tocleft" ><a href="tcllib/files/modules/yaml/yaml.html">yaml</a></td>
<td class="#tocright">YAML Format Encoder/Decoder</td>
</tr>
</table></dl>
<dl><dt>zip<dd>
<table class="#toc">
<tr class="#toceven" >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/decode.html">zipfile::encode</a></td>
<td class="#tocright">Access to zip archives</td>
</tr>
<tr class="#tocodd"  >
<td class="#tocleft" ><a href="tcllib/files/modules/zip/encode.html">zipfile::encode</a></td>
<td class="#tocright">Generation of zip archives</td>
</tr>
</table></dl></table></dl>
Changes to modules/comm/comm.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[vset COMM_VERSION 4.6.3]
[manpage_begin comm n [vset COMM_VERSION]]
[see_also send(n)]
[keywords comm]
[keywords communication]
[keywords ipc]
[keywords message]
[keywords {remote communication}]
[keywords {remote execution}]
[keywords rpc]
[keywords secure]
[keywords send]
[keywords socket]
[keywords ssl]
[keywords tls]
[copyright {1995-1998 The Open Group. All Rights Reserved.}]
[copyright {2003-2004 ActiveState Corporation.}]
[copyright {2006-2009 Andreas Kupries <[email protected]>}]
[moddesc   {Remote communication}]
[titledesc {A remote communication facility for Tcl (8.3 and later)}]
[category  {Programming tools}]
[require Tcl 8.3]
[require comm [opt [vset COMM_VERSION]]]
[description]

[para]

The [package comm] command provides an inter-interpreter remote
execution facility much like Tk's [cmd send(n)], except that it uses
sockets rather than the X server for the communication path.  As a
<
|




















|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

[manpage_begin comm n 4.6.2]
[see_also send(n)]
[keywords comm]
[keywords communication]
[keywords ipc]
[keywords message]
[keywords {remote communication}]
[keywords {remote execution}]
[keywords rpc]
[keywords secure]
[keywords send]
[keywords socket]
[keywords ssl]
[keywords tls]
[copyright {1995-1998 The Open Group. All Rights Reserved.}]
[copyright {2003-2004 ActiveState Corporation.}]
[copyright {2006-2009 Andreas Kupries <[email protected]>}]
[moddesc   {Remote communication}]
[titledesc {A remote communication facility for Tcl (8.3 and later)}]
[category  {Programming tools}]
[require Tcl 8.3]
[require comm [opt 4.6.2]]
[description]

[para]

The [package comm] command provides an inter-interpreter remote
execution facility much like Tk's [cmd send(n)], except that it uses
sockets rather than the X server for the communication path.  As a
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
Note that requiring no version (or a specific version) can also be done.

[para]
The revision history of [package comm] includes these releases:

[list_begin definitions]

[def 4.6.3]

Fixed ticket [lb]ced0d60fc9[rb]. Added proper detection of eof on a
socket, properly closing it.

[def 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.

[def 4.6.1]







<
<
<
<
<







877
878
879
880
881
882
883





884
885
886
887
888
889
890
Note that requiring no version (or a specific version) can also be done.

[para]
The revision history of [package comm] includes these releases:

[list_begin definitions]






[def 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.

[def 4.6.1]
Changes to modules/comm/comm.tcl.
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
}

proc ::comm::commIncomingOffered {chan fid addr remport} {
    variable comm

    # Check if we have a complete line.
    if {[gets $fid protoline] < 0} {
	#commDebug {puts stderr "commIncomingOffered: no data"}
	if {[eof $fid]} {
	    commDebug {puts stderr "commIncomingOffered: eof on fid=$fid"}
	    catch {
		close $fid
	    }
	}
	return
    }

    # Protocol version line has been received, disable event handling
    # again.
    fileevent $fid readable {}
    fconfigure $fid -blocking 1







<
<
<
<
<
<
<







925
926
927
928
929
930
931







932
933
934
935
936
937
938
}

proc ::comm::commIncomingOffered {chan fid addr remport} {
    variable comm

    # Check if we have a complete line.
    if {[gets $fid protoline] < 0} {







	return
    }

    # Protocol version line has been received, disable event handling
    # again.
    fileevent $fid readable {}
    fconfigure $fid -blocking 1
1811
1812
1813
1814
1815
1816
1817
1818
	::comm::comm config -local 1
    } else {
	::comm::comm new ::comm::comm -port 0 -local 1 -listen 1
    }
}

#eof
package provide comm 4.6.3.1







|
1804
1805
1806
1807
1808
1809
1810
1811
	::comm::comm config -local 1
    } else {
	::comm::comm new ::comm::comm -port 0 -local 1 -listen 1
    }
}

#eof
package provide comm 4.6.2
Changes to modules/comm/pkgIndex.tcl.
1
2
if {![package vsatisfies [package provide Tcl] 8.3]} {return}
package ifneeded comm 4.6.3.1 [list source [file join $dir comm.tcl]]

|
1
2
if {![package vsatisfies [package provide Tcl] 8.3]} {return}
package ifneeded comm 4.6.2 [list source [file join $dir comm.tcl]]
Changes to modules/coroutine/coro_auto.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[comment {-*- tcl -*- doctools manpage}]
[vset CORO_AUTO_VERSION 1.1.2]
[manpage_begin coroutine::auto n [vset CORO_AUTO_VERSION]]
[keywords after]
[keywords channel]
[keywords coroutine]
[keywords events]
[keywords exit]
[keywords gets]
[keywords global]
[keywords {green threads}]
[keywords read]
[keywords threads]
[keywords update]
[keywords vwait]
[copyright {2010-2014 Andreas Kupries <[email protected]>}]
[moddesc   {Coroutine utilities}]
[category  Coroutine]
[titledesc {Automatic event and IO coroutine awareness}]
[require Tcl 8.6]
[require coroutine::auto [vset CORO_AUTO_VERSION]]
[require coroutine 1.1]
[description]

The [package coroutine::auto] package provides no commands or other
directly visible functionality.

Built on top of the package [package coroutine], it intercepts various

<
|












|




|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin coroutine::auto n 1]
[keywords after]
[keywords channel]
[keywords coroutine]
[keywords events]
[keywords exit]
[keywords gets]
[keywords global]
[keywords {green threads}]
[keywords read]
[keywords threads]
[keywords update]
[keywords vwait]
[copyright {2010-2011 Andreas Kupries <[email protected]>}]
[moddesc   {Coroutine utilities}]
[category  Coroutine]
[titledesc {Automatic event and IO coroutine awareness}]
[require Tcl 8.6]
[require coroutine::auto 1.1.1]
[require coroutine 1.1]
[description]

The [package coroutine::auto] package provides no commands or other
directly visible functionality.

Built on top of the package [package coroutine], it intercepts various
Changes to modules/coroutine/coro_auto.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## -- Tcl Module -- -*- tcl -*-
# # ## ### ##### ######## #############

# @@ Meta Begin
# Package coroutine::auto 1.1.2
# Meta platform        tcl
# Meta require         {Tcl 8.6}
# Meta require         {coroutine 1.1}
# Meta license         BSD
# Meta as::author      {Andreas Kupries}
# Meta as::origin      http://wiki.tcl.tk/21555
# Meta summary         Coroutine Event and Channel Support
# Meta description     Built on top of coroutine, this
# Meta description     package intercepts various builtin
# Meta description     commands to make the code using them
# Meta description     coroutine-oblivious, i.e. able to run
# Meta description     inside and outside of a coroutine
# Meta description     without changes.
# @@ Meta End

# Copyright (c) 2009-2014 Andreas Kupries

## $Id: coro_auto.tcl,v 1.3 2011/11/17 08:00:45 andreas_kupries Exp $
# # ## ### ##### ######## #############
## Requisites, and ensemble setup.

package require Tcl 8.6
package require coroutine




|















|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## -- Tcl Module -- -*- tcl -*-
# # ## ### ##### ######## #############

# @@ Meta Begin
# Package coroutine::auto 1.1
# Meta platform        tcl
# Meta require         {Tcl 8.6}
# Meta require         {coroutine 1.1}
# Meta license         BSD
# Meta as::author      {Andreas Kupries}
# Meta as::origin      http://wiki.tcl.tk/21555
# Meta summary         Coroutine Event and Channel Support
# Meta description     Built on top of coroutine, this
# Meta description     package intercepts various builtin
# Meta description     commands to make the code using them
# Meta description     coroutine-oblivious, i.e. able to run
# Meta description     inside and outside of a coroutine
# Meta description     without changes.
# @@ Meta End

# Copyright (c) 2009-2011 Andreas Kupries

## $Id: coro_auto.tcl,v 1.3 2011/11/17 08:00:45 andreas_kupries Exp $
# # ## ### ##### ######## #############
## Requisites, and ensemble setup.

package require Tcl 8.6
package require coroutine
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
    # where necessary. During 

    while {1} {
        set blocking [::chan configure $chan -blocking]
        ::chan configure $chan -blocking 0

	try {
	    set result [::coroutine::auto::core_gets $chan line]
	} on error {result opts} {
            ::chan configure $chan -blocking $blocking
            return -code $result -options $opts
	}

	if {[::chan blocked $chan]} {
            ::chan event $chan readable [list [info coroutine]]







|







132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
    # where necessary. During 

    while {1} {
        set blocking [::chan configure $chan -blocking]
        ::chan configure $chan -blocking 0

	try {
	    ::coroutine::auto::core_gets $chan line
	} on error {result opts} {
            ::chan configure $chan -blocking $blocking
            return -code $result -options $opts
	}

	if {[::chan blocked $chan]} {
            ::chan event $chan readable [list [info coroutine]]
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
	# Loop until eof.

	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		set result [::coroutine::auto::core_read $chan]
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[::chan blocked $chan]} {
		::chan event $chan readable [list [info coroutine]]
		yield
		::chan event $chan readable {}
	    } else {
		::chan configure $chan -blocking $blocking
		append buf $result








|





|







207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
	# Loop until eof.

	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		::coroutine::auto::core_read $chan
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[fblocked $chan]} {
		::chan event $chan readable [list [info coroutine]]
		yield
		::chan event $chan readable {}
	    } else {
		::chan configure $chan -blocking $blocking
		append buf $result

237
238
239
240
241
242
243
244
245
246
247
248
249
250
251

	set left $total
	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		set result [::coroutine::auto::core_read $chan $left]
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[::chan blocked $chan]} {
		::chan event $chan readable [list [info coroutine]]







|







237
238
239
240
241
242
243
244
245
246
247
248
249
250
251

	set left $total
	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		::coroutine::auto::core_read $chan $left
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[::chan blocked $chan]} {
		::chan event $chan readable [list [info coroutine]]
306
307
308
309
310
311
312
313
314

    return
} ::coroutine::auto}

# # ## ### ##### ######## #############
## Ready

package provide coroutine::auto 1.1.2
return







|

306
307
308
309
310
311
312
313
314

    return
} ::coroutine::auto}

# # ## ### ##### ######## #############
## Ready

package provide coroutine::auto 1.1.1
return
Changes to modules/coroutine/coroutine.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
## -- Tcl Module -- -*- tcl -*-
# # ## ### ##### ######## #############

# @@ Meta Begin
# Package coroutine 1.1.1
# Meta platform        tcl
# Meta require         {Tcl 8.6}
# Meta license         BSD
# Meta as::author      {Andreas Kupries}
# Meta as::author      {Colin Macleod}
# Meta as::author      {Colin McCormack}
# Meta as::author      {Donal Fellows}




|







1
2
3
4
5
6
7
8
9
10
11
12
## -- Tcl Module -- -*- tcl -*-
# # ## ### ##### ######## #############

# @@ Meta Begin
# Package coroutine 1
# Meta platform        tcl
# Meta require         {Tcl 8.6}
# Meta license         BSD
# Meta as::author      {Andreas Kupries}
# Meta as::author      {Colin Macleod}
# Meta as::author      {Colin McCormack}
# Meta as::author      {Donal Fellows}
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Meta description     coroutine::auto, which intercepts
# Meta description     the relevant builtin commands and changes
# Meta description     their implementation dependending on the
# Meta description     context they are run in, i.e. inside or
# Meta description     outside of a coroutine.
# @@ Meta End

# Copyright (c) 2009,2014 Andreas Kupries
# Copyright (c) 2009 Colin Macleod
# Copyright (c) 2009 Colin McCormack
# Copyright (c) 2009 Donal Fellows
# Copyright (c) 2009 Kevin Kenny
# Copyright (c) 2009 Neil Madden
# Copyright (c) 2009 Peter Spjuth








|







33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Meta description     coroutine::auto, which intercepts
# Meta description     the relevant builtin commands and changes
# Meta description     their implementation dependending on the
# Meta description     context they are run in, i.e. inside or
# Meta description     outside of a coroutine.
# @@ Meta End

# Copyright (c) 2009 Andreas Kupries
# Copyright (c) 2009 Colin Macleod
# Copyright (c) 2009 Colin McCormack
# Copyright (c) 2009 Donal Fellows
# Copyright (c) 2009 Kevin Kenny
# Copyright (c) 2009 Neil Madden
# Copyright (c) 2009 Peter Spjuth

177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
    # where necessary. During 

    while {1} {
        set blocking [::chan configure $chan -blocking]
        ::chan configure $chan -blocking 0

	try {
	    set result [::chan gets $chan line]
	} on error {result opts} {
            ::chan configure $chan -blocking $blocking
            return -code $result -options $opts
	}

	if {[::chan blocked $chan]} {
            ::chan event $chan readable [list [info coroutine]]







|







177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
    # where necessary. During 

    while {1} {
        set blocking [::chan configure $chan -blocking]
        ::chan configure $chan -blocking 0

	try {
	    ::chan gets $chan line
	} on error {result opts} {
            ::chan configure $chan -blocking $blocking
            return -code $result -options $opts
	}

	if {[::chan blocked $chan]} {
            ::chan event $chan readable [list [info coroutine]]
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
	# Loop until eof.

	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		set result [::chan read $chan]
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[::chan blocked $chan]} {
		::chan event $chan readable [list [info coroutine]]
		yield
		::chan event $chan readable {}
	    } else {
		::chan configure $chan -blocking $blocking
		append buf $result








|





|







244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
	# Loop until eof.

	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		::chan read $chan
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[fblocked $chan]} {
		::chan event $chan readable [list [info coroutine]]
		yield
		::chan event $chan readable {}
	    } else {
		::chan configure $chan -blocking $blocking
		append buf $result

274
275
276
277
278
279
280
281
282
283
284
285
286
287
288

	set left $total
	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		set result [::chan read $chan $left]
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[::chan blocked $chan]} {
		::chan event $chan readable [list [info coroutine]]







|







274
275
276
277
278
279
280
281
282
283
284
285
286
287
288

	set left $total
	while {1} {
	    set blocking [::chan configure $chan -blocking]
	    ::chan configure $chan -blocking 0

	    try {
		::chan read $chan $left
	    } on error {result opts} {
		::chan configure $chan -blocking $blocking
		return -code $result -options $opts
	    }

	    if {[::chan blocked $chan]} {
		::chan event $chan readable [list [info coroutine]]
369
370
371
372
373
374
375
376
377
namespace eval ::coroutine::util {
    #checker exclude warnShadowVar
    variable counter 0
}

# # ## ### ##### ######## #############
## Ready
package provide coroutine 1.1.1
return







|

369
370
371
372
373
374
375
376
377
namespace eval ::coroutine::util {
    #checker exclude warnShadowVar
    variable counter 0
}

# # ## ### ##### ######## #############
## Ready
package provide coroutine 1.1
return
Changes to modules/coroutine/pkgIndex.tcl.
1
2
3
if {![package vsatisfies [package provide Tcl] 8.6]} {return}
package ifneeded coroutine       1.1.1 [list source [file join $dir coroutine.tcl]]
package ifneeded coroutine::auto 1.1.1 [list source [file join $dir coro_auto.tcl]]

|

1
2
3
if {![package vsatisfies [package provide Tcl] 8.6]} {return}
package ifneeded coroutine       1.1   [list source [file join $dir coroutine.tcl]]
package ifneeded coroutine::auto 1.1.1 [list source [file join $dir coro_auto.tcl]]
Changes to modules/coroutine/tcllib_coroutine.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[comment {-*- tcl -*- doctools manpage}]
[vset CORO_VERSION 1.1.1]
[manpage_begin coroutine n [vset CORO_VERSION]]
[keywords after]
[keywords channel]
[keywords coroutine]
[keywords events]
[keywords exit]
[keywords gets]
[keywords global]
[keywords {green threads}]
[keywords read]
[keywords threads]
[keywords update]
[keywords vwait]
[copyright {2010-2014 Andreas Kupries <[email protected]>}]
[moddesc   {Coroutine utilities}]
[category  Coroutine]
[titledesc {Coroutine based event and IO handling}]
[require Tcl 8.6]
[require coroutine [vset CORO_VERSION]]
[description]

The [package coroutine] package provides coroutine-aware
implementations of various event- and channel related commands. It can
be in multiple modes:

[list_begin enumerated]

<
|












|




|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin coroutine n 1]
[keywords after]
[keywords channel]
[keywords coroutine]
[keywords events]
[keywords exit]
[keywords gets]
[keywords global]
[keywords {green threads}]
[keywords read]
[keywords threads]
[keywords update]
[keywords vwait]
[copyright {2010-2011 Andreas Kupries <[email protected]>}]
[moddesc   {Coroutine utilities}]
[category  Coroutine]
[titledesc {Coroutine based event and IO handling}]
[require Tcl 8.6]
[require coroutine 1.1]
[description]

The [package coroutine] package provides coroutine-aware
implementations of various event- and channel related commands. It can
be in multiple modes:

[list_begin enumerated]
Changes to modules/crc/cksum.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[vset CKSUM_VERSION 1.1.4]
[manpage_begin cksum n [vset CKSUM_VERSION]]
[see_also crc32(n)]
[see_also sum(n)]
[keywords checksum]
[keywords cksum]
[keywords crc]
[keywords crc32]
[keywords {cyclic redundancy check}]
[keywords {data integrity}]
[keywords security]
[copyright {2002, Pat Thoyts}]
[moddesc   {Cyclic Redundancy Checks}]
[titledesc {Calculate a cksum(1) compatible checksum}]
[category  {Hashes, checksums, and encryption}]
[require Tcl 8.2]
[require cksum [opt [vset CKSUM_VERSION]]]
[description]
[para]

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.

<
|














|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

[manpage_begin cksum n 1.1.3]
[see_also crc32(n)]
[see_also sum(n)]
[keywords checksum]
[keywords cksum]
[keywords crc]
[keywords crc32]
[keywords {cyclic redundancy check}]
[keywords {data integrity}]
[keywords security]
[copyright {2002, Pat Thoyts}]
[moddesc   {Cyclic Redundancy Checks}]
[titledesc {Calculate a cksum(1) compatible checksum}]
[category  {Hashes, checksums, and encryption}]
[require Tcl 8.2]
[require cksum [opt 1.1.3]]
[description]
[para]

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.

Changes to modules/crc/cksum.tcl.
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# -------------------------------------------------------------------------
# $Id: cksum.tcl,v 1.11 2009/04/21 20:06:19 andreas_kupries Exp $

package require Tcl 8.2;                # tcl minimum version

namespace eval ::crc {
    variable cksum_version 1.1.4

    namespace export cksum

    variable cksum_tbl [list 0x0 \
           0x04C11DB7 0x09823B6E 0x0D4326D9 0x130476DC 0x17C56B6B \
           0x1A864DB2 0x1E475005 0x2608EDB8 0x22C9F00F 0x2F8AD6D6 \
           0x2B4BCB61 0x350C9B64 0x31CD86D3 0x3C8EA00A 0x384FBDBD \







|







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# -------------------------------------------------------------------------
# $Id: cksum.tcl,v 1.11 2009/04/21 20:06:19 andreas_kupries Exp $

package require Tcl 8.2;                # tcl minimum version

namespace eval ::crc {
    variable cksum_version 1.1.3

    namespace export cksum

    variable cksum_tbl [list 0x0 \
           0x04C11DB7 0x09823B6E 0x0D4326D9 0x130476DC 0x17C56B6B \
           0x1A864DB2 0x1E475005 0x2608EDB8 0x22C9F00F 0x2F8AD6D6 \
           0x2B4BCB61 0x350C9B64 0x31CD86D3 0x3C8EA00A 0x384FBDBD \
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
           0xCC2B1D17 0xC8EA00A0 0xD6AD50A5 0xD26C4D12 0xDF2F6BCB \
           0xDBEE767C 0xE3A1CBC1 0xE760D676 0xEA23F0AF 0xEEE2ED18 \
           0xF0A5BD1D 0xF464A0AA 0xF9278673 0xFDE69BC4 0x89B8FD09 \
           0x8D79E0BE 0x803AC667 0x84FBDBD0 0x9ABC8BD5 0x9E7D9662 \
           0x933EB0BB 0x97FFAD0C 0xAFB010B1 0xAB710D06 0xA6322BDF \
           0xA2F33668 0xBCB4666D 0xB8757BDA 0xB5365D03 0xB1F740B4 ]

    variable uid
    if {![info exists uid]} {set uid 0}
}

# crc::CksumInit -- 
#
#	Create and initialize a cksum context. This is cleaned up when we
#	call CksumFinal to obtain the result.
#







<
|







69
70
71
72
73
74
75

76
77
78
79
80
81
82
83
           0xCC2B1D17 0xC8EA00A0 0xD6AD50A5 0xD26C4D12 0xDF2F6BCB \
           0xDBEE767C 0xE3A1CBC1 0xE760D676 0xEA23F0AF 0xEEE2ED18 \
           0xF0A5BD1D 0xF464A0AA 0xF9278673 0xFDE69BC4 0x89B8FD09 \
           0x8D79E0BE 0x803AC667 0x84FBDBD0 0x9ABC8BD5 0x9E7D9662 \
           0x933EB0BB 0x97FFAD0C 0xAFB010B1 0xAB710D06 0xA6322BDF \
           0xA2F33668 0xBCB4666D 0xB8757BDA 0xB5365D03 0xB1F740B4 ]


    variable uid ; if {![info exists uid]} {set uid 0}
}

# crc::CksumInit -- 
#
#	Create and initialize a cksum context. This is cleaned up when we
#	call CksumFinal to obtain the result.
#
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106



107
108
109
110
111
112
113
114
115
116
117


118
119
120
121
122
123
124
125
126

proc ::crc::CksumUpdate {token data} {
    variable cksum_tbl
    upvar #0 $token state
    set t $state(t)
    binary scan $data c* r
    foreach {n} $r {
        set index [expr { (($t >> 24) ^ ($n & 0xFF)) & 0xFF }]
        # Since the introduction of built-in bigInt support with Tcl
        # 8.5, bit-shifting $t to the left no longer overflows,
        # keeping it 32 bits long.  The value grows bigger and bigger
        # instead - a severe hit on performance.  For this reason we
        # do a bitwise AND against 0xFFFFFFFF at each step to keep the
        # value within limits.
        set t [expr {0xFFFFFFFF & (($t << 8) ^ [lindex $cksum_tbl $index])}]



        incr state(l)
    }
    set state(t) $t
    return
}

proc ::crc::CksumFinal {token} {
    variable cksum_tbl
    upvar #0 $token state
    set t $state(t)
    for {set i $state(l)} {$i > 0} {set i [expr {$i>>8}]} {


        set index [expr {(($t >> 24) ^ $i) & 0xFF}]
        set t [expr {0xFFFFFFFF & (($t << 8) ^ [lindex $cksum_tbl $index])}]
    }
    unset state
    return [expr {~$t & 0xFFFFFFFF}]
}

# crc::Pop --
#







|
<
<
<
<
<
<
|
>
>
>











>
>
|
<







91
92
93
94
95
96
97
98






99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

117
118
119
120
121
122
123

proc ::crc::CksumUpdate {token data} {
    variable cksum_tbl
    upvar #0 $token state
    set t $state(t)
    binary scan $data c* r
    foreach {n} $r {
        set t [expr {($t << 8)






                     ^ [lindex $cksum_tbl [expr {
                                                 (($t >> 24) \
                                                      ^ ($n & 0xFF)) & 0xFF
                                             }]]}]
        incr state(l)
    }
    set state(t) $t
    return
}

proc ::crc::CksumFinal {token} {
    variable cksum_tbl
    upvar #0 $token state
    set t $state(t)
    for {set i $state(l)} {$i > 0} {set i [expr {$i>>8}]} {
        set t [expr {($t << 8) \
                         ^ [lindex $cksum_tbl \
                                [expr {(($t >> 24) ^ $i) & 0xFF}]]}]

    }
    unset state
    return [expr {~$t & 0xFFFFFFFF}]
}

# crc::Pop --
#
Changes to modules/crc/pkgIndex.tcl.
1
2
3
4
5
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded cksum 1.1.4 [list source [file join $dir cksum.tcl]]
package ifneeded crc16 1.1.2 [list source [file join $dir crc16.tcl]]
package ifneeded crc32 1.3.1 [list source [file join $dir crc32.tcl]]
package ifneeded sum   1.1.1 [list source [file join $dir sum.tcl]]

|


|
1
2
3
4
5
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded cksum 1.1.3 [list source [file join $dir cksum.tcl]]
package ifneeded crc16 1.1.2 [list source [file join $dir crc16.tcl]]
package ifneeded crc32 1.3.1 [list source [file join $dir crc32.tcl]]
package ifneeded sum   1.1.0 [list source [file join $dir sum.tcl]]
Changes to modules/crc/sum.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[vset SUM_VERSION 1.1.1]
[manpage_begin sum n [vset SUM_VERSION]]
[see_also cksum(n)]
[see_also crc32(n)]
[see_also sum(1)]
[keywords checksum]
[keywords cksum]
[keywords crc]
[keywords crc32]
[keywords {cyclic redundancy check}]
[keywords {data integrity}]
[keywords security]
[keywords sum]
[copyright {2002, Pat Thoyts <[email protected]>}]
[moddesc   {Cyclic Redundancy Checks}]
[titledesc {Calculate a sum(1) compatible checksum}]
[category  {Hashes, checksums, and encryption}]
[require Tcl 8.2]
[require sum [opt [vset SUM_VERSION]]]
[description]
[para]

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.
<
|
















|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

[manpage_begin sum n 1.1.0]
[see_also cksum(n)]
[see_also crc32(n)]
[see_also sum(1)]
[keywords checksum]
[keywords cksum]
[keywords crc]
[keywords crc32]
[keywords {cyclic redundancy check}]
[keywords {data integrity}]
[keywords security]
[keywords sum]
[copyright {2002, Pat Thoyts <[email protected]>}]
[moddesc   {Cyclic Redundancy Checks}]
[titledesc {Calculate a sum(1) compatible checksum}]
[category  {Hashes, checksums, and encryption}]
[require Tcl 8.2]
[require sum [opt 1.1.0]]
[description]
[para]

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.
Changes to modules/crc/sum.tcl.
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

package require Tcl 8.2;                # tcl minimum version

catch {package require tcllibc};        # critcl enhancements to tcllib
#catch {package require crcc};           # critcl enhanced crc module

namespace eval ::crc {
    variable sum_version 1.1.1
    namespace export sum

    variable uid
    if {![info exists uid]} {
        set uid 0
    }
}







|







17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

package require Tcl 8.2;                # tcl minimum version

catch {package require tcllibc};        # critcl enhancements to tcllib
#catch {package require crcc};           # critcl enhanced crc module

namespace eval ::crc {
    variable sum_version 1.1.0
    namespace export sum

    variable uid
    if {![info exists uid]} {
        set uid 0
    }
}
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#
proc ::crc::SumSysV {s {seed 0}} {
    set t $seed
    binary scan $s c* r
    foreach n $r {
        incr t [expr {$n & 0xFF}]
    }
    return [expr {$t & 0xFFFF}]
}

# -------------------------------------------------------------------------
# Description:
#  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.
#







|







40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#
proc ::crc::SumSysV {s {seed 0}} {
    set t $seed
    binary scan $s c* r
    foreach n $r {
        incr t [expr {$n & 0xFF}]
    }
    return [expr {$t % 0xFFFF}]
}

# -------------------------------------------------------------------------
# Description:
#  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.
#
Changes to modules/crc/sum.test.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

37
38
39
40

41
42
43
44
45
46
47

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.4
testsNeedTcltest 2.0

testing {
    useLocal sum.tcl sum ::crc
}

# -------------------------------------------------------------------------

if {[info command ::crc::SumBsd_c] == {}} {
    puts "> pure tcl"
} else {    
    puts "> critcl based"
}

# -------------------------------------------------------------------------

test sum-1.0 {sum with no parameters} -body {
   ::crc::sum
} -returnCodes error -result {wrong # args: should be  "sum ?-bsd|-sysv? ?-format string? ?-chunksize size?  ?-timeout ms? -file name | -channel chan | data"}


test sum-1.1 {sum with incorrect parameters} -body {
   ::crc::sum -zxcv
} -returnCodes error -result {bad option -zxcv: must be one of -bsd, -channel, -chunksize, -filename, -format, -sysv, -timeout}


# -------------------------------------------------------------------------

foreach {n msg expected} {
    1    ""
    "0"
    2    "a"







|
|















|
|
|
>

|
|
|
>







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.2
testsNeedTcltest 1.0

testing {
    useLocal sum.tcl sum ::crc
}

# -------------------------------------------------------------------------

if {[info command ::crc::SumBsd_c] == {}} {
    puts "> pure tcl"
} else {    
    puts "> critcl based"
}

# -------------------------------------------------------------------------

test sum-1.0 {sum with no parameters } {
    list [catch {::crc::sum} result] \
        [string match "wrong \# args: *" $result]
} {1 1}

test sum-1.1 {sum with incorrect parameters } {
    list [catch {::crc::sum -zxcv} result] \
        [string match "bad option -zxcv: *" $result]
} {1 1}

# -------------------------------------------------------------------------

foreach {n msg expected} {
    1    ""
    "0"
    2    "a"
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
    7    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    "25587"
    8    "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
    "21845"
    9    "\uFFFE\u0000\u0001\u0002"
    "16418"
} {
    test sum-2.$n {sum using BSD algorithm and unsigned integer} -body {
	::crc::sum -bsd $msg
    } -result $expected
}

# -------------------------------------------------------------------------
foreach {n msg expected} {
    1    ""
    "0"
    2    "a"







|

|







59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
    7    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    "25587"
    8    "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
    "21845"
    9    "\uFFFE\u0000\u0001\u0002"
    "16418"
} {
    test sum-2.$n {sum using BSD algorithm and unsigned integer} {
	::crc::sum -bsd $msg
    } $expected
}

# -------------------------------------------------------------------------
foreach {n msg expected} {
    1    ""
    "0"
    2    "a"
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
    7    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    "5387"
    8    "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
    "4200"
    9    "\uFFFE\u0000\u0001\u0002"
    "257"
} {
    test sum-3.$n {sum using SysV algorithm and unsigned integer} -body {
	::crc::sum -sysv $msg
    } -result $expected
}

# -------------------------------------------------------------------------

set crc::testfile [info script]

proc ::crc::loaddata {filename} {
    set f [open $filename r]
    fconfigure $f -translation binary
    set data [read $f]
    close $f
    return $data
}

test sum-4.0 {sum file option (BSD)} -body {
    set r1 [::crc::sum -bsd -file $::crc::testfile]
    set r2 [::crc::sum -bsd [::crc::loaddata $::crc::testfile]]
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} -result ok

test sum-4.1 {sum file option (SysV)} -body {
    set r1 [::crc::sum -sysv -file $::crc::testfile]
    set r2 [::crc::sum -sysv [::crc::loaddata $crc::testfile]]
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} -result ok

test sum-4.2 {sum -channel option (BSD)} -body {
    set r1 [::crc::sum -bsd [::crc::loaddata $::crc::testfile]]
    set f [open $::crc::testfile r]
    fconfigure $f -translation binary
    set r2 [::crc::sum -bsd -channel $f]
    close $f
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} -result ok

test sum-4.3 {sum -channel option (SysV)} -body {
    set r1 [::crc::sum -sysv -file $::crc::testfile]
    set f [open $::crc::testfile r]
    fconfigure $f -translation binary
    set r2 [::crc::sum -sysv -channel $f]
    close $f
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} -result ok

# -------------------------------------------------------------------------

test sum-5.0 {sum format option (BSD)} -body {
    ::crc::sum -bsd -format 0x%X [string repeat x 200]
} -result 0xF8EE

test sum-5.1 {sum format option (SysV)} -body {
    ::crc::sum -sysv -format 0x%X [string repeat x 200]
} -result 0x5DC0

# -------------------------------------------------------------------------
# ticket a80e60deb1 vectors - data over 1 KB length.

foreach {n expected base count} {
    0 58624 a    1280
    1 11008 fx    640
    2 62976 \xfe 1280
} {
    test sum-6.$n {sum (sysv) over 1 K} -body {
        crc::sum -sysv -- [string repeat $base $count]
    } -result $expected
}

# -------------------------------------------------------------------------

catch {unset ::crc::testfile}
testsuiteCleanup

# Local Variables:
#  mode: tcl
#  indent-tabs-mode: nil
# End:








|

|














|







|

|







|

|










|

|










|



|

|

|

<
<
<
<
<
<
<
<
<
|
<
<
<
<











85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162









163




164
165
166
167
168
169
170
171
172
173
174
    7    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    "5387"
    8    "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
    "4200"
    9    "\uFFFE\u0000\u0001\u0002"
    "257"
} {
    test sum-3.$n {sum using SysV algorithm and unsigned integer} {
	::crc::sum -sysv $msg
    } $expected
}

# -------------------------------------------------------------------------

set crc::testfile [info script]

proc ::crc::loaddata {filename} {
    set f [open $filename r]
    fconfigure $f -translation binary
    set data [read $f]
    close $f
    return $data
}

test sum-4.0 {sum file option (BSD)} {
    set r1 [::crc::sum -bsd -file $::crc::testfile]
    set r2 [::crc::sum -bsd [::crc::loaddata $::crc::testfile]]
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} {ok}

test sum-4.1 {sum file option (SysV)} {
    set r1 [::crc::sum -sysv -file $::crc::testfile]
    set r2 [::crc::sum -sysv [::crc::loaddata $crc::testfile]]
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} {ok}

test sum-4.2 {sum -channel option (BSD)} {
    set r1 [::crc::sum -bsd [::crc::loaddata $::crc::testfile]]
    set f [open $::crc::testfile r]
    fconfigure $f -translation binary
    set r2 [::crc::sum -bsd -channel $f]
    close $f
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} {ok}

test sum-4.3 {sum -channel option (SysV)} {
    set r1 [::crc::sum -sysv -file $::crc::testfile]
    set f [open $::crc::testfile r]
    fconfigure $f -translation binary
    set r2 [::crc::sum -sysv -channel $f]
    close $f
    if {$r1 != $r2} {
        set r "differing results: $r1 != $r2"
    } else {
        set r ok
    }
} {ok}

# -------------------------------------------------------------------------

test sum-5.0 {sum format option (BSD)} {
    ::crc::sum -bsd -format 0x%X [string repeat x 200]
} {0xF8EE}

test sum-5.1 {sum format option (SysV)} {
    ::crc::sum -sysv -format 0x%X [string repeat x 200]









} {0x5DC0}





# -------------------------------------------------------------------------

catch {unset ::crc::testfile}
testsuiteCleanup

# Local Variables:
#  mode: tcl
#  indent-tabs-mode: nil
# End:

Changes to modules/debug/debug.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[comment {-*- tcl -*- doctools manpage}]
[vset PACKAGE_VERSION 1.0.5]
[manpage_begin debug n [vset PACKAGE_VERSION]]
[keywords debug]
[keywords log]
[keywords narrative]
[keywords trace]
[copyright {200?, Colin McCormack, Wub Server Utilities}]
[copyright {2012-2014, Andreas Kupries <[email protected]>}]
[moddesc {debug narrative}]
[titledesc {debug narrative - core}]
[category  {debugging, tracing, and logging}]
[require Tcl 8.5]
[require debug [opt [vset PACKAGE_VERSION]]]
[description]

Debugging areas of interest are represented by 'tags' which have
independently settable levels of interest (an integer, higher is more
detailed).

[section API]

[list_begin definitions]

[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug.[var tag]] [arg message] [opt [arg 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 [arg message] is provided as a Tcl script whose value is
[cmd subst]ed in the caller's scope if and only if the current level of
interest for the [arg tag] matches or exceeds the call's [arg level]
of detail.  This is useful, as one can place arbitrarily complex
narrative in code without unnecessarily evaluating it.

|






|


















|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[comment {-*- tcl -*- doctools manpage}]
[vset PACKAGE_VERSION 1.0.2]
[manpage_begin debug n [vset PACKAGE_VERSION]]
[keywords debug]
[keywords log]
[keywords narrative]
[keywords trace]
[copyright {200?, Colin McCormack, Wub Server Utilities}]
[copyright {2012, Andreas Kupries <[email protected]>}]
[moddesc {debug narrative}]
[titledesc {debug narrative - core}]
[category  {debugging, tracing, and logging}]
[require Tcl 8.5]
[require debug [opt [vset PACKAGE_VERSION]]]
[description]

Debugging areas of interest are represented by 'tags' which have
independently settable levels of interest (an integer, higher is more
detailed).

[section API]

[list_begin definitions]

[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug.[var tag]] [arg message] [opt [arg level]]]

For each known tag the package creates a command with this signatur
the user can then use to provide the debug narrative of the tag.

The narrative [arg message] is provided as a Tcl script whose value is
[cmd subst]ed in the caller's scope if and only if the current level of
interest for the [arg tag] matches or exceeds the call's [arg level]
of detail.  This is useful, as one can place arbitrarily complex
narrative in code without unnecessarily evaluating it.
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162

This is a convenience method formatting the dictionary similarly to
how the builtin command [cmd parray] does for array, and returns the
resulting string.

[para] This makes it suitable for use in debug messages.

[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug] [method hexl] [arg data] [opt [arg prefix]]]

This is a convenience method formatting arbitrary data into a hex-dump
and returns the resulting string.

[para] This makes it suitable for use in debug messages.

[para] Each line of the dump is prefixed with [arg prefix]. This prefix
defaults to the empty string.

[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug] [method nl]]

This is a convenience method to insert a linefeed character (ASCII 0x0a)
into a debug message.

[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug] [method tab]]

This is a convenience method to insert a TAB character (ASCII 0x09)
into a debug message.

[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug] [method prefix] [arg tag] [opt [arg text]]]

This method is similar to the method [method header] above, in that it
defines [cmd subst]able Tcl script which provides more text for debug
messages.








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







126
127
128
129
130
131
132























133
134
135
136
137
138
139

This is a convenience method formatting the dictionary similarly to
how the builtin command [cmd parray] does for array, and returns the
resulting string.

[para] This makes it suitable for use in debug messages.
























[comment {= = == === ===== ======== ============= =====================}]
[call [cmd debug] [method prefix] [arg tag] [opt [arg text]]]

This method is similar to the method [method header] above, in that it
defines [cmd subst]able Tcl script which provides more text for debug
messages.

Changes to modules/debug/debug.tcl.
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
## Requisites

package require Tcl 8.5

namespace eval ::debug {
    namespace export -clear \
	define on off prefix suffix header trailer \
	names 2array level setting parray pdict \
	nl tab hexl
    namespace ensemble create -subcommands {}
}

# # ## ### ##### ######## ############# #####################
## API & Implementation

proc ::debug::noop {args} {}







|
<







17
18
19
20
21
22
23
24

25
26
27
28
29
30
31
## Requisites

package require Tcl 8.5

namespace eval ::debug {
    namespace export -clear \
	define on off prefix suffix header trailer \
	names 2array level setting parray pdict

    namespace ensemble create -subcommands {}
}

# # ## ### ##### ######## ############# #####################
## API & Implementation

proc ::debug::noop {args} {}
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
	    interp alias {} debug.$tag {} ::debug::noop
	}
    }
    return
}

# # ## ### ##### ######## ############# #####################
## Convenience commands.
# Format arrays and dicts as multi-line message.
# Insert newlines and tabs.

proc ::debug::nl  {} { return \n }
proc ::debug::tab {} { return \t }

proc ::debug::parray {a {pattern *}} {
    upvar 1 $a array
    if {![array exists array]} {
	error "\"$a\" isn't an array"
    }
    pdict [array get array] $pattern
}

proc ::debug::pdict {dict {pattern *}} {
    set maxl 0
    set names [lsort -dict [dict keys $dict $pattern]]
    foreach name $names {
	if {[string length $name] > $maxl} {
	    set maxl [string length $name]
	}
    }
    set maxl [expr {$maxl + 2}]
    set lines {}
    foreach name $names {
	set nameString [format (%s) $name]
	lappend lines [format "%-*s = %s" \
			   $maxl $nameString \
			   [dict get $dict $name]]
    }
    return [join $lines \n]
}

proc ::debug::hexl {data {prefix {}}} {
    set r {}

    # Convert the data to hex and to characters.
    binary scan $data H*@0a* hexa asciia

    # Replace non-printing characters in the data with dots.
    regsub -all -- {[^[:graph:] ]} $asciia {.} asciia

    # Pad with spaces to a full multiple of 32/16.
    set n [expr {[string length $hexa] % 32}]
    if {$n < 32} { append hexa   [string repeat { } [expr {32-$n}]] }
    #puts "pad H [expr {32-$n}]"

    set n [expr {[string length $asciia] % 32}]
    if {$n < 16} { append asciia [string repeat { } [expr {16-$n}]] }
    #puts "pad A [expr {32-$n}]"

    # Reassemble formatted, in groups of 16 bytes/characters.
    # The hex part is handled in groups of 32 nibbles.
    set addr 0
    while {[string length $hexa]} {
	# Get front group of 16 bytes each.
	set hex    [string range $hexa   0 31]
	set ascii  [string range $asciia 0 15]
	# Prep for next iteration
	set hexa   [string range $hexa   32 end]  
	set asciia [string range $asciia 16 end]

	# Convert the hex to pairs of hex digits
	regsub -all -- {..} $hex {& } hex

	# Add the hex and latin-1 data to the result buffer
	append r $prefix [format %04x $addr] { | } $hex { |} $ascii |\n
	incr addr 16
    }

    # And done
    return $r
}

# # ## ### ##### ######## ############# #####################

namespace eval debug {
    variable detail     ; # map: TAG -> level of interest
    variable prefix     ; # map: TAG -> message prefix to use
    variable suffix     ; # map: TAG -> message suffix to use
    variable fds        ; # map: TAG -> handle of open channel to log to.
    variable header  {} ; # per-line heading, subst'ed
    variable trailer {} ; # per-line ending, subst'ed

    # Notes:
    # - The tag '::' is reserved. "prefix" and "suffix" use it to store
    #   the global message prefix / suffix.
    # - prefix and suffix are applied per message.
    # - header and trailer are per line. And should not generate multiple lines!
}

# # ## ### ##### ######## ############# #####################
## Ready

package provide debug 1.0.5
return







|
<
<
<
<
<




















|







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















|

202
203
204
205
206
207
208
209





210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237









































238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
	    interp alias {} debug.$tag {} ::debug::noop
	}
    }
    return
}

# # ## ### ##### ######## ############# #####################
## Convenience command. Format an array as multi-line message.






proc ::debug::parray {a {pattern *}} {
    upvar 1 $a array
    if {![array exists array]} {
	error "\"$a\" isn't an array"
    }
    pdict [array get array] $pattern
}

proc ::debug::pdict {dict {pattern *}} {
    set maxl 0
    set names [lsort -dict [dict keys $dict $pattern]]
    foreach name $names {
	if {[string length $name] > $maxl} {
	    set maxl [string length $name]
	}
    }
    set maxl [expr {$maxl + 2}]
    set lines {}
    foreach name $names {
	set nameString [format %s(%s) $name]
	lappend lines [format "%-*s = %s" \
			   $maxl $nameString \
			   [dict get $dict $name]]
    }
    return [join $lines \n]
}










































# # ## ### ##### ######## ############# #####################

namespace eval debug {
    variable detail     ; # map: TAG -> level of interest
    variable prefix     ; # map: TAG -> message prefix to use
    variable suffix     ; # map: TAG -> message suffix to use
    variable fds        ; # map: TAG -> handle of open channel to log to.
    variable header  {} ; # per-line heading, subst'ed
    variable trailer {} ; # per-line ending, subst'ed

    # Notes:
    # - The tag '::' is reserved. "prefix" and "suffix" use it to store
    #   the global message prefix / suffix.
    # - prefix and suffix are applied per message.
    # - header and trailer are per line. And should not generate multiple lines!
}

# # ## ### ##### ######## ############# #####################
## Ready

package provide debug 1.0.2
return
Changes to modules/debug/pkgIndex.tcl.
1
2
3
4
5
if {![package vsatisfies [package require Tcl] 8.5]} return
package ifneeded debug            1.0.5 [list source [file join $dir debug.tcl]]
package ifneeded debug::heartbeat 1     [list source [file join $dir heartbeat.tcl]]
package ifneeded debug::timestamp 1     [list source [file join $dir timestamp.tcl]]
package ifneeded debug::caller    1     [list source [file join $dir caller.tcl]]

|



1
2
3
4
5
if {![package vsatisfies [package require Tcl] 8.5]} return
package ifneeded debug            1.0.2 [list source [file join $dir debug.tcl]]
package ifneeded debug::heartbeat 1     [list source [file join $dir heartbeat.tcl]]
package ifneeded debug::timestamp 1     [list source [file join $dir timestamp.tcl]]
package ifneeded debug::caller    1     [list source [file join $dir caller.tcl]]
Changes to modules/dns/dns.tcl.
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package require Tcl 8.2;                # tcl minimum version
package require logger;                 # tcllib 1.3
package require uri;                    # tcllib 1.1
package require uri::urn;               # tcllib 1.2
package require ip;                     # tcllib 1.7

namespace eval ::dns {
    variable version 1.3.4
    variable rcsid {$Id: dns.tcl,v 1.36 2008/11/22 12:28:54 mic42 Exp $}

    namespace export configure resolve name address cname \
        status reset wait cleanup errorcode

    variable options
    if {![info exists options]} {







|







34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package require Tcl 8.2;                # tcl minimum version
package require logger;                 # tcllib 1.3
package require uri;                    # tcllib 1.1
package require uri::urn;               # tcllib 1.2
package require ip;                     # tcllib 1.7

namespace eval ::dns {
    variable version 1.3.3
    variable rcsid {$Id: dns.tcl,v 1.36 2008/11/22 12:28:54 mic42 Exp $}

    namespace export configure resolve name address cname \
        status reset wait cleanup errorcode

    variable options
    if {![info exists options]} {
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
#     dns://nameserver/target?type=A
#
# URI quoting to be accounted for.
#

catch {
    uri::register {dns} {
        variable escape     [set [namespace parent [namespace current]]::basic::escape]
        variable host       [set [namespace parent [namespace current]]::basic::host]
        variable hostOrPort [set [namespace parent [namespace current]]::basic::hostOrPort]

        variable class [string map {* \\\\*} \
                       "class=([join [array names ::dns::classes] {|}])"]
        variable type  [string map {* \\\\*} \
                       "type=([join [array names ::dns::types] {|}])"]
        variable classOrType "(?:${class}|${type})"
        variable classOrTypeSpec "(?:${class}|${type})(?:;(?:${class}|${type}))?"

        variable query "${host}(${classOrTypeSpec})?"
        variable schemepart "(//${hostOrPort}/)?(${query})"
        variable url "dns:$schemepart"
    }
}

namespace eval ::uri {} ;# needed for pkg_mkIndex.








|
|
|

|

|

|
|

|







1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
#     dns://nameserver/target?type=A
#
# URI quoting to be accounted for.
#

catch {
    uri::register {dns} {
        set escape     [set [namespace parent [namespace current]]::basic::escape]
        set host       [set [namespace parent [namespace current]]::basic::host]
        set hostOrPort [set [namespace parent [namespace current]]::basic::hostOrPort]

        set class [string map {* \\\\*} \
                       "class=([join [array names ::dns::classes] {|}])"]
        set type  [string map {* \\\\*} \
                       "type=([join [array names ::dns::types] {|}])"]
        set classOrType "(?:${class}|${type})"
        set classOrTypeSpec "(?:${class}|${type})(?:;(?:${class}|${type}))?"

        set query "${host}(${classOrTypeSpec})?"
        variable schemepart "(//${hostOrPort}/)?(${query})"
        variable url "dns:$schemepart"
    }
}

namespace eval ::uri {} ;# needed for pkg_mkIndex.

Changes to modules/dns/ip.tcl.
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# $Id: ip.tcl,v 1.14 2010/08/16 17:35:18 andreas_kupries Exp $

# @mdgen EXCLUDE: ipMoreC.tcl

package require Tcl 8.2;                # tcl minimum version

namespace eval ip {
    variable version 1.2.2
    variable rcsid {$Id: ip.tcl,v 1.14 2010/08/16 17:35:18 andreas_kupries Exp $}

    namespace export is version normalize equal type contract mask collapse subtract
    #catch {namespace ensemble create}

    variable IPv4Ranges
    if {![info exists IPv4Ranges]} {







|







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# $Id: ip.tcl,v 1.14 2010/08/16 17:35:18 andreas_kupries Exp $

# @mdgen EXCLUDE: ipMoreC.tcl

package require Tcl 8.2;                # tcl minimum version

namespace eval ip {
    variable version 1.2.1
    variable rcsid {$Id: ip.tcl,v 1.14 2010/08/16 17:35:18 andreas_kupries Exp $}

    namespace export is version normalize equal type contract mask collapse subtract
    #catch {namespace ensemble create}

    variable IPv4Ranges
    if {![info exists IPv4Ranges]} {
Changes to modules/dns/ip.test.
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
    3 255.0.0.0        8   8 0xff000000  8
    4 0.0.0.0          0   9 0x00000000  0
} {
    test ip-11.$i "maskToLength, $m" {
        ip::maskToLength $m
    } $e
}

# -------------------------------------------------------------------------

foreach {i ip e} {
    0 0.0.0.0                  0
    1 0.0.0.1                  1
    2 0.0.1.0                256
    3 0.1.0.0              65536
    4 1.0.0.0           16777216
    5 0.0.0.255              255
    6 0.0.255.0            65280
    7 0.255.0.0         16711680
    8 255.0.0.0       4278190080
    9 255.255.255.255 4294967295
} {
    test ip-12.$i "toInteger $ip" {
        ip::toInteger $ip
    } $e
}

# -------------------------------------------------------------------------

foreach {i pma e} {
    0 {1.1.1.1 24}   1.1.2.1/0
    1 {1.1.1.1 24 0} 1.1.1.1/0
    2 {1.1.1.1 24 1} 1.1.2.1/0
    3 {1.1.1.1 24 2} 1.1.3.1/0
} {
    test ip-13.$i "nextNet $pma" {
        ip::nativeToPrefix [eval ip::nextNet $pma]
    } $e
}


# -------------------------------------------------------------------------

testsuiteCleanup

# Local Variables:
#  mode: tcl







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







223
224
225
226
227
228
229

































230
231
232
233
234
235
236
    3 255.0.0.0        8   8 0xff000000  8
    4 0.0.0.0          0   9 0x00000000  0
} {
    test ip-11.$i "maskToLength, $m" {
        ip::maskToLength $m
    } $e
}


































# -------------------------------------------------------------------------

testsuiteCleanup

# Local Variables:
#  mode: tcl
Changes to modules/dns/ipMore.tcl.
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#
# See Also:
#
# End of Header

proc ::ip::toInteger {ip} {
    binary scan [ip::Normalize4 $ip] I out
    return [format %u [expr {$out & 0xffffffff}]]
}

##Procedure Header
# Copyright (c) 2004 Cisco Systems, Inc.
#
# Name:
#       ::ip::toHex







|







308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#
# See Also:
#
# End of Header

proc ::ip::toInteger {ip} {
    binary scan [ip::Normalize4 $ip] I out
    return $out
}

##Procedure Header
# Copyright (c) 2004 Cisco Systems, Inc.
#
# Name:
#       ::ip::toHex
651
652
653
654
655
656
657
658

659
660
661
662
663
664
665
666
	}
    }
    if {![string is integer -strict $prefix]} { 
	set prefix [toInteger $prefix]
    }
    if {![string is integer -strict $mask] || ($mask < 33 && $mask > 0)} {
	set mask [maskToInt $mask]
    }    

    set prefix [expr {$prefix + ((($mask ^ 0xFFffFFff) + 1) * $count) }]
    return [format "0x%08x" $prefix]
}


##Procedure Header
# Copyright (c) 2004 Cisco Systems, Inc.
#







|
>
|







651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
	}
    }
    if {![string is integer -strict $prefix]} { 
	set prefix [toInteger $prefix]
    }
    if {![string is integer -strict $mask] || ($mask < 33 && $mask > 0)} {
	set mask [maskToInt $mask]
    } 
    
    set prefix [expr $prefix + ($mask ^ 0xFFffFFff) + $count ]
    return [format "0x%08x" $prefix]
}


##Procedure Header
# Copyright (c) 2004 Cisco Systems, Inc.
#
Changes to modules/dns/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
# pkgIndex.tcl -
#
# $Id: pkgIndex.tcl,v 1.21 2010/08/16 17:35:18 andreas_kupries Exp $

if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded dns    1.3.4 [list source [file join $dir dns.tcl]]
package ifneeded resolv 1.0.3 [list source [file join $dir resolv.tcl]]
package ifneeded ip     1.2.2 [list source [file join $dir ip.tcl]]
package ifneeded spf    1.1.1 [list source [file join $dir spf.tcl]]





|

|

1
2
3
4
5
6
7
8
9
# pkgIndex.tcl -
#
# $Id: pkgIndex.tcl,v 1.21 2010/08/16 17:35:18 andreas_kupries Exp $

if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded dns    1.3.3 [list source [file join $dir dns.tcl]]
package ifneeded resolv 1.0.3 [list source [file join $dir resolv.tcl]]
package ifneeded ip     1.2.1 [list source [file join $dir ip.tcl]]
package ifneeded spf    1.1.1 [list source [file join $dir spf.tcl]]
Changes to modules/dns/tcllib_dns.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[vset DNS_VERSION 1.3.4]
[manpage_begin dns n [vset DNS_VERSION]]
[see_also resolver(5)]
[keywords DNS]
[keywords {domain name service}]
[keywords resolver]
[keywords {rfc 1034}]
[keywords {rfc 1035}]
[keywords {rfc 1886}]
[copyright {2002, Pat Thoyts}]
[moddesc   {Domain Name Service}]
[titledesc {Tcl Domain Name Service Client}]
[category  Networking]
[require Tcl 8.2]
[require dns [opt [vset DNS_VERSION]]]
[description]
[para]

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.

<
|












|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

[manpage_begin dns n 1.3.3]
[see_also resolver(5)]
[keywords DNS]
[keywords {domain name service}]
[keywords resolver]
[keywords {rfc 1034}]
[keywords {rfc 1035}]
[keywords {rfc 1886}]
[copyright {2002, Pat Thoyts}]
[moddesc   {Domain Name Service}]
[titledesc {Tcl Domain Name Service Client}]
[category  Networking]
[require Tcl 8.2]
[require dns [opt 1.3.3]]
[description]
[para]

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.

Changes to modules/dns/tcllib_ip.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[vset IP_VERSION 1.2.2]
[manpage_begin tcllib_ip n [vset IP_VERSION]]
[see_also inet(3)]
[see_also ip(7)]
[see_also ipv6(7)]
[keywords {internet address}]
[keywords ip]
[keywords ipv4]
[keywords ipv6]
[keywords {rfc 3513}]
[copyright {2004, Pat Thoyts}]
[copyright {2005 Aamer Akhter <[email protected]>}]
[moddesc   {Domain Name Service}]
[titledesc {IPv4 and IPv6 address manipulation}]
[category  Networking]
[require Tcl 8.2]
[require ip [opt [vset IP_VERSION]]]
[description]
[para]

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.

<
|














|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

[manpage_begin tcllib_ip n 1.2.1]
[see_also inet(3)]
[see_also ip(7)]
[see_also ipv6(7)]
[keywords {internet address}]
[keywords ip]
[keywords ipv4]
[keywords ipv6]
[keywords {rfc 3513}]
[copyright {2004, Pat Thoyts}]
[copyright {2005 Aamer Akhter <[email protected]>}]
[moddesc   {Domain Name Service}]
[titledesc {IPv4 and IPv6 address manipulation}]
[category  Networking]
[require Tcl 8.2]
[require ip [opt 1.2.1]]
[description]
[para]

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.

Changes to modules/doctools/checker.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- tcl -*-
# checker.tcl
#
# Code used inside of a checker interpreter to ensure correct usage of
# doctools formatting commands.
#
# Copyright (c) 2003-2014 Andreas Kupries <[email protected]>

# L10N

package require msgcat

proc ::msgcat::mcunknown {locale code} {
    return "unknown error code \"$code\" (for locale $locale)"






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- tcl -*-
# checker.tcl
#
# Code used inside of a checker interpreter to ensure correct usage of
# doctools formatting commands.
#
# Copyright (c) 2003-2010 Andreas Kupries <[email protected]>

# L10N

package require msgcat

proc ::msgcat::mcunknown {locale code} {
    return "unknown error code \"$code\" (for locale $locale)"
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# Variable handling ...

proc vset {var args} {
    switch -exact -- [llength $args] {
	0 {
	    # Retrieve contents of variable VAR
	    upvar #0 __$var data
	    if {![info exists data]} {
		return -code error "can't read doc variable \"$var\": not set"
	    }
	    return $data
	}
	1 {
	    # Set contents of variable VAR
	    global __$var
	    set    __$var [lindex $args 0]
	    return "" ; # Empty string ! Nothing for output.







<
<
<







248
249
250
251
252
253
254



255
256
257
258
259
260
261
# Variable handling ...

proc vset {var args} {
    switch -exact -- [llength $args] {
	0 {
	    # Retrieve contents of variable VAR
	    upvar #0 __$var data



	    return $data
	}
	1 {
	    # Set contents of variable VAR
	    global __$var
	    set    __$var [lindex $args 0]
	    return "" ; # Empty string ! Nothing for output.
Changes to modules/doctools/doctools.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[comment {-*- tcl -*- doctools manpage}]
[vset PACKAGE_VERSION 1.4.18]
[manpage_begin doctools n [vset PACKAGE_VERSION]]
[see_also doctools_intro]
[see_also doctools_lang_cmdref]
[see_also doctools_lang_intro]
[see_also doctools_lang_syntax]
[see_also doctools_plugin_apiref]
[keywords conversion]
[keywords documentation]
[keywords HTML]
[keywords manpage]
[keywords markup]
[keywords nroff]
[keywords TMML]
[copyright {2003-2014 Andreas Kupries <[email protected]>}]
[moddesc   {Documentation tools}]
[titledesc {doctools - Processing documents}]
[category  {Documentation tools}]
[require Tcl 8.2]
[require doctools [opt [vset PACKAGE_VERSION]]]
[description]

This package provides a class for the creation of objects able to
process and convert text written in the [term doctools] markup
language into any output format X for which a
[term {formatting engine}] is available.


<
|












|




|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin doctools n 1.4.16]
[see_also doctools_intro]
[see_also doctools_lang_cmdref]
[see_also doctools_lang_intro]
[see_also doctools_lang_syntax]
[see_also doctools_plugin_apiref]
[keywords conversion]
[keywords documentation]
[keywords HTML]
[keywords manpage]
[keywords markup]
[keywords nroff]
[keywords TMML]
[copyright {2003-2013 Andreas Kupries <[email protected]>}]
[moddesc   {Documentation tools}]
[titledesc {doctools - Processing documents}]
[category  {Documentation tools}]
[require Tcl 8.2]
[require doctools [opt 1.4.16]]
[description]

This package provides a class for the creation of objects able to
process and convert text written in the [term doctools] markup
language into any output format X for which a
[term {formatting engine}] is available.

Changes to modules/doctools/doctools.tcl.
1
2
3
4
5
6
7
8


9
10
11
12
13
14
15
# doctools.tcl --
#
#	Implementation of doctools objects for Tcl.
#
# Copyright (c) 2003-2014 Andreas Kupries <[email protected]>
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.



package require Tcl 8.2
package require textutil::expander

# @mdgen OWNER: api.tcl
# @mdgen OWNER: checker.tcl
# @mdgen OWNER: mpformats/*.tcl




|



>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# doctools.tcl --
#
#	Implementation of doctools objects for Tcl.
#
# Copyright (c) 2003-2013 Andreas Kupries <[email protected]>
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: doctools.tcl,v 1.45 2011/02/23 22:11:59 andreas_kupries Exp $

package require Tcl 8.2
package require textutil::expander

# @mdgen OWNER: api.tcl
# @mdgen OWNER: checker.tcl
# @mdgen OWNER: mpformats/*.tcl
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549

    if {!$ex_ok}       {SetupExpander  $name}
    if {$chk_ip == ""} {SetupChecker   $name}
    # assert (format_ip != "")

    set warnings [list]
    if {[catch {$format_ip eval fmt_initialize}]} {
	return -code error -errorcode {DOCTOOLS ENGINE} \
	    "Could not initialize engine"
    }
    set result ""

    for {
	set p $passes ; set n 1
    } {
	$p > 0
    } {
	incr p -1 ; incr n
    } {
	if {[catch {$format_ip eval [list fmt_setup $n]}]} {
	    catch {$format_ip eval fmt_shutdown}
	    return -code error -errorcode {DOCTOOLS ENGINE} \
		"Could not initialize pass $n of engine"
	}
	$chk_ip eval ck_initialize $n

	if {[catch {set result [$expander expand $text]} msg]} {
	    catch {$format_ip eval fmt_shutdown}
	    # Filter for checker errors and reduce them to the essential message.

	    if {![regexp {^Error in} $msg]}          {
		return -code error -errorcode {DOCTOOLS INPUT} $msg
	    }
	    #set msg [join [lrange [split $msg \n] 2 end]]

	    if {![regexp {^--> \(FmtError\) } $msg]} {
		return -code error -errorcode {DOCTOOLS INPUT} "Doctools $msg"
	    }
	    set msg [lindex [split $msg \n] 0]
	    regsub {^--> \(FmtError\) } $msg {} msg

	    return -code error -errorcode {DOCTOOLS INPUT} $msg
	}

	$chk_ip eval ck_complete
    }

    if {[catch {set result [$format_ip eval [list fmt_postprocess $result]]}]} {
	return -code error -errorcode {DOCTOOLS ENGINE} \
	    "Unable to post process final result"
    }
    if {[catch {$format_ip eval fmt_shutdown}]} {
	return -code error -errorcode {DOCTOOLS ENGINE} \
	    "Could not shut engine down"
    }
    return $result

}

# ::doctools::_search --
#







<
|












<
|







|
<
<


|
<
<



|






<
|


<
|







491
492
493
494
495
496
497

498
499
500
501
502
503
504
505
506
507
508
509
510

511
512
513
514
515
516
517
518
519


520
521
522


523
524
525
526
527
528
529
530
531
532

533
534
535

536
537
538
539
540
541
542
543

    if {!$ex_ok}       {SetupExpander  $name}
    if {$chk_ip == ""} {SetupChecker   $name}
    # assert (format_ip != "")

    set warnings [list]
    if {[catch {$format_ip eval fmt_initialize}]} {

	return -code error "Could not initialize engine"
    }
    set result ""

    for {
	set p $passes ; set n 1
    } {
	$p > 0
    } {
	incr p -1 ; incr n
    } {
	if {[catch {$format_ip eval [list fmt_setup $n]}]} {
	    catch {$format_ip eval fmt_shutdown}

	    return -code error "Could not initialize pass $n of engine"
	}
	$chk_ip eval ck_initialize $n

	if {[catch {set result [$expander expand $text]} msg]} {
	    catch {$format_ip eval fmt_shutdown}
	    # Filter for checker errors and reduce them to the essential message.

	    if {![regexp {^Error in} $msg]}          {return -code error $msg}


	    #set msg [join [lrange [split $msg \n] 2 end]]

	    if {![regexp {^--> \(FmtError\) } $msg]} {return -code error "Doctools $msg"}


	    set msg [lindex [split $msg \n] 0]
	    regsub {^--> \(FmtError\) } $msg {} msg

	    return -code error $msg
	}

	$chk_ip eval ck_complete
    }

    if {[catch {set result [$format_ip eval [list fmt_postprocess $result]]}]} {

	return -code error "Unable to post process final result"
    }
    if {[catch {$format_ip eval fmt_shutdown}]} {

	return -code error "Could not shut engine down"
    }
    return $result

}

# ::doctools::_search --
#
1352
1353
1354
1355
1356
1357
1358
1359
    # => FOO/mpformats

    #catch {search [file join $here                lib doctools mpformats]}
    #catch {search [file join [file dirname $here] lib doctools mpformats]}
    catch {search [file join $here                             mpformats]}
}

package provide doctools 1.4.18







|
1346
1347
1348
1349
1350
1351
1352
1353
    # => FOO/mpformats

    #catch {search [file join $here                lib doctools mpformats]}
    #catch {search [file join [file dirname $here] lib doctools mpformats]}
    catch {search [file join $here                             mpformats]}
}

package provide doctools 1.4.17
Changes to modules/doctools/pkgIndex.tcl.
1
2
3
4
5
6
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded doctools            1.4.18 [list source [file join $dir doctools.tcl]]
package ifneeded doctools::toc       1.1.3  [list source [file join $dir doctoc.tcl]]
package ifneeded doctools::idx       1.0.4  [list source [file join $dir docidx.tcl]]
package ifneeded doctools::cvs       1      [list source [file join $dir cvs.tcl]]
package ifneeded doctools::changelog 1.1    [list source [file join $dir changelog.tcl]]

|




1
2
3
4
5
6
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded doctools            1.4.17 [list source [file join $dir doctools.tcl]]
package ifneeded doctools::toc       1.1.3  [list source [file join $dir doctoc.tcl]]
package ifneeded doctools::idx       1.0.4  [list source [file join $dir docidx.tcl]]
package ifneeded doctools::cvs       1      [list source [file join $dir cvs.tcl]]
package ifneeded doctools::changelog 1.1    [list source [file join $dir changelog.tcl]]
Changes to modules/dtplite/dtplite.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- tcl -*- \
# @@ Meta Begin
# Application dtplite 1.2
# Meta platform     tcl
# Meta summary      Lightweight DocTools Processor
# Meta description  This application is a simple processor
# Meta description  for documents written in the doctools
# Meta description  markup language. It covers the most
# Meta description  common use cases, but is not as
# Meta description  configurable as its big brother dtp.
# Meta category     Processing doctools documents
# Meta subject      doctools doctoc docidx
# Meta require      {doctools 1}
# Meta require      {doctools::idx 1}
# Meta require      {doctools::toc 1}
# Meta require      fileutil
# Meta require      textutil::repeat
# Meta author       Andreas Kupries
# Meta license      BSD
# @@ Meta End

package provide dtplite 1.2

# dtp lite - Lightweight DocTools Processor
# ======== = ==============================
#
# Use cases
# ---------
#


|


















|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- tcl -*- \
# @@ Meta Begin
# Application dtplite 1.1
# Meta platform     tcl
# Meta summary      Lightweight DocTools Processor
# Meta description  This application is a simple processor
# Meta description  for documents written in the doctools
# Meta description  markup language. It covers the most
# Meta description  common use cases, but is not as
# Meta description  configurable as its big brother dtp.
# Meta category     Processing doctools documents
# Meta subject      doctools doctoc docidx
# Meta require      {doctools 1}
# Meta require      {doctools::idx 1}
# Meta require      {doctools::toc 1}
# Meta require      fileutil
# Meta require      textutil::repeat
# Meta author       Andreas Kupries
# Meta license      BSD
# @@ Meta End

package provide dtplite 1.1

# dtp lite - Lightweight DocTools Processor
# ======== = ==============================
#
# Use cases
# ---------
#
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
proc ::dtplite::Usage {} {
    global argv0
    Print stderr "$argv0 wrong#args, expected:\
	    -o outputpath ?-merge? ?-ext ext?\
	    ?-style file? ?-header file?\
	    ?-footer file? ?-nav label url?...\
	    format inputpath"
    return -code error -errorcode {DTPLITE STOP} {}
}

proc ::dtplite::ArgError {text} {
    global argv0
    Print stderr "$argv0: $text"
    return -code error -errorcode {DTPLITE STOP} {}
}

proc ::dtplite::Print {args} {
    variable print
    set cmd [concat $print $args]
    return [uplevel 1 $cmd]
}







|





|







634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
proc ::dtplite::Usage {} {
    global argv0
    Print stderr "$argv0 wrong#args, expected:\
	    -o outputpath ?-merge? ?-ext ext?\
	    ?-style file? ?-header file?\
	    ?-footer file? ?-nav label url?...\
	    format inputpath"
    return -code error -errorcode STOP {}
}

proc ::dtplite::ArgError {text} {
    global argv0
    Print stderr "$argv0: $text"
    return -code error -errorcode STOP {}
}

proc ::dtplite::Print {args} {
    variable print
    set cmd [concat $print $args]
    return [uplevel 1 $cmd]
}
Changes to modules/dtplite/pkgIndex.tcl.
1
2
3
4
5
if {![package vsatisfies [package provide Tcl] 8.2]} {
    # PRAGMA: returnok
    return
}
package ifneeded dtplite 1.2 [list source [file join $dir dtplite.tcl]]




|
1
2
3
4
5
if {![package vsatisfies [package provide Tcl] 8.2]} {
    # PRAGMA: returnok
    return
}
package ifneeded dtplite 1.1 [list source [file join $dir dtplite.tcl]]
Changes to modules/dtplite/pkg_dtplite.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[comment {-*- tcl -*- doctools manpage}]
[vset PACKAGE_VERSION 1.2]
[manpage_begin dtplite n [vset PACKAGE_VERSION]]
[see_also {docidx introduction}]
[see_also {doctoc introduction}]
[see_also {doctools introduction}]
[keywords conversion]
[keywords docidx]
[keywords doctoc]
[keywords doctools]
[keywords HTML]
[keywords manpage]
[keywords markup]
[keywords nroff]
[keywords TMML]
[copyright {2004-2013 Andreas Kupries <[email protected]>}]
[titledesc {Lightweight DocTools Markup Processor}]
[moddesc   {Documentation toolbox}]
[category  {Documentation tools}]
[require dtplite [opt [vset PACKAGE_VERSION]]]
[description]
[para]

The application described by this document, [syscmd dtplite], is the
successor to the extremely simple [syscmd mpexpand]. Influenced in its
functionality by the [syscmd dtp] doctools processor it is much more
powerful than [syscmd mpexpand], yet still as easy to use; definitely

<
|
















<







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin dtplite n 1.1]
[see_also {docidx introduction}]
[see_also {doctoc introduction}]
[see_also {doctools introduction}]
[keywords conversion]
[keywords docidx]
[keywords doctoc]
[keywords doctools]
[keywords HTML]
[keywords manpage]
[keywords markup]
[keywords nroff]
[keywords TMML]
[copyright {2004-2013 Andreas Kupries <[email protected]>}]
[titledesc {Lightweight DocTools Markup Processor}]
[moddesc   {Documentation toolbox}]
[category  {Documentation tools}]

[description]
[para]

The application described by this document, [syscmd dtplite], is the
successor to the extremely simple [syscmd mpexpand]. Influenced in its
functionality by the [syscmd dtp] doctools processor it is much more
powerful than [syscmd mpexpand], yet still as easy to use; definitely
Changes to modules/ftp/ftp.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[comment {-*- tcl -*- doctools manpage}]
[vset PACKAGE_VERSION 2.4.13]
[manpage_begin ftp n [vset PACKAGE_VERSION]]
[see_also ftpd]
[see_also mime]
[see_also pop3]
[see_also smtp]
[keywords ftp]
[keywords internet]
[keywords net]
[keywords {rfc 959}]
[moddesc   {ftp client}]
[titledesc {Client-side tcl implementation of the ftp protocol}]
[category  Networking]
[require Tcl 8.2]
[require ftp [opt [vset PACKAGE_VERSION]]]
[description]

[para]

The ftp package provides the client side of the ftp protocol as
specified in RFC 959 ([uri http://www.rfc-editor.org/rfc/rfc959.txt]).
The package implements both active (default) and passive ftp sessions.

<
|












|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin ftp n 2.4.11]
[see_also ftpd]
[see_also mime]
[see_also pop3]
[see_also smtp]
[keywords ftp]
[keywords internet]
[keywords net]
[keywords {rfc 959}]
[moddesc   {ftp client}]
[titledesc {Client-side tcl implementation of the ftp protocol}]
[category  Networking]
[require Tcl 8.2]
[require ftp [opt 2.4.11]]
[description]

[para]

The ftp package provides the client side of the ftp protocol as
specified in RFC 959 ([uri http://www.rfc-editor.org/rfc/rfc959.txt]).
The package implements both active (default) and passive ftp sessions.
Changes to modules/ftp/ftp.tcl.
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Handle timeouts
# 
# Arguments:
#  -
#
proc ::ftp::Timeout {s} {
    upvar ::ftp::ftp$s ftp
    variable VERBOSE

    if {$VERBOSE} { DisplayMsg $s Waiting|Timeout! }

    after cancel $ftp(Wait)
    set ftp(state.control) 1

    DisplayMsg "" "Timeout of control connection after $ftp(Timeout) sec.!" error
    Command $ftp(Command) timeout
    return







<
<
<







114
115
116
117
118
119
120



121
122
123
124
125
126
127
# Handle timeouts
# 
# Arguments:
#  -
#
proc ::ftp::Timeout {s} {
    upvar ::ftp::ftp$s ftp




    after cancel $ftp(Wait)
    set ftp(state.control) 1

    DisplayMsg "" "Timeout of control connection after $ftp(Timeout) sec.!" error
    Command $ftp(Command) timeout
    return
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# 
# Arguments:
#  -		
#

proc ::ftp::WaitOrTimeout {s} {
    upvar ::ftp::ftp$s ftp
    variable VERBOSE

    set retvar 1

    if { ![string length $ftp(Command)] && [info exists ftp(state.control)] } {

	if {$VERBOSE} { DisplayMsg $s Waiting|$ftp(Timeout)|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }

        set ftp(Wait) [after [expr {$ftp(Timeout) * 1000}] [list [namespace current]::Timeout $s]]

        vwait ::ftp::ftp${s}(state.control)
        set retvar $ftp(state.control)

	if {$VERBOSE} { DisplayMsg $s Waiting|Done|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }
    }

    if {$ftp(Error) != ""} {
        set errmsg $ftp(Error)
        set ftp(Error) ""
        DisplayMsg $s $errmsg error
    }

    if {$VERBOSE} { DisplayMsg $s Waiting|OK|$retvar }
    return $retvar
}

#############################################################################
#
# WaitComplete --
#
# Transaction completed.
# Cancel execution of the delayed command declared in procedure WaitOrTimeout.
# 
# Arguments:
# value -	result of the transaction
#			0 ... Error
#			1 ... OK
#

proc ::ftp::WaitComplete {s value} {
    variable VERBOSE
    upvar ::ftp::ftp$s ftp

    if {$VERBOSE} { DisplayMsg $s Waiting|Complete|$s|$value|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }

    if {![info exists ftp(Command)]} {
	set ftp(state.control) $value

	if {$VERBOSE} { DisplayMsg $s Waiting|Complete|Done/Command|$value|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }
	return $value
    }
    if { ![string length $ftp(Command)] && [info exists ftp(state.data)] } {

	if {$VERBOSE} { DisplayMsg $s Waiting|State|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }

        vwait ::ftp::ftp${s}(state.data)

	if {$VERBOSE} { DisplayMsg $s Waiting|State|Done|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }
    }

    catch {after cancel $ftp(Wait)}
    set ftp(state.control) $value

    if {$VERBOSE} { DisplayMsg $s Waiting|OK|$ftp(state.control)|\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# }

    return $ftp(state.control)
}

#############################################################################
#
# PutsCtrlSocket --
#







<





<
<




<
<








<

















<


<
<


<
<



<
<
<

<
<




<
<
<







140
141
142
143
144
145
146

147
148
149
150
151


152
153
154
155


156
157
158
159
160
161
162
163

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180

181
182


183
184


185
186
187



188


189
190
191
192



193
194
195
196
197
198
199
# 
# Arguments:
#  -		
#

proc ::ftp::WaitOrTimeout {s} {
    upvar ::ftp::ftp$s ftp


    set retvar 1

    if { ![string length $ftp(Command)] && [info exists ftp(state.control)] } {



        set ftp(Wait) [after [expr {$ftp(Timeout) * 1000}] [list [namespace current]::Timeout $s]]

        vwait ::ftp::ftp${s}(state.control)
        set retvar $ftp(state.control)


    }

    if {$ftp(Error) != ""} {
        set errmsg $ftp(Error)
        set ftp(Error) ""
        DisplayMsg $s $errmsg error
    }


    return $retvar
}

#############################################################################
#
# WaitComplete --
#
# Transaction completed.
# Cancel execution of the delayed command declared in procedure WaitOrTimeout.
# 
# Arguments:
# value -	result of the transaction
#			0 ... Error
#			1 ... OK
#

proc ::ftp::WaitComplete {s value} {

    upvar ::ftp::ftp$s ftp



    if {![info exists ftp(Command)]} {
	set ftp(state.control) $value


	return $value
    }
    if { ![string length $ftp(Command)] && [info exists ftp(state.data)] } {



        vwait ::ftp::ftp${s}(state.data)


    }

    catch {after cancel $ftp(Wait)}
    set ftp(state.control) $value



    return $ftp(state.control)
}

#############################################################################
#
# PutsCtrlSocket --
#
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
#			the socket channel identifier.

proc ::ftp::StateHandler {s {sock ""}} {
    upvar ::ftp::ftp$s ftp
    variable DEBUG 
    variable VERBOSE

    if {$VERBOSE} { DisplayMsg $s StateHandler/$s/$sock/================================================ }

    # disable fileevent on control socket, enable it at the and of the state machine
    # fileevent $ftp(CtrlSock) readable {}
		
    # there is no socket (and no channel to get) if called from a procedure

    set rc "   "
    set msgtext {}







<
<







231
232
233
234
235
236
237


238
239
240
241
242
243
244
#			the socket channel identifier.

proc ::ftp::StateHandler {s {sock ""}} {
    upvar ::ftp::ftp$s ftp
    variable DEBUG 
    variable VERBOSE



    # disable fileevent on control socket, enable it at the and of the state machine
    # fileevent $ftp(CtrlSock) readable {}
		
    # there is no socket (and no channel to get) if called from a procedure

    set rc "   "
    set msgtext {}
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
            if {![string equal $ftp(State) "quit_sent"]} {
		set ftp(Error) "Service not available!"
	    }
            CloseDataConn $s
            WaitComplete $s 0
	    Command $ftp(Command) terminated
            catch {unset ftp(State)}

	    if {$VERBOSE} { DisplayMsg $s EOF/Control }
            return
        } else {
	    # Fix SF bug #466746: Incomplete line, do nothing.
	    if {$VERBOSE} { DisplayMsg $s Incomplete/Line }
	    return	   
	}
    } 
	
    if { $DEBUG } {
        DisplayMsg $s "-> rc=\"$rc\" -> msgtext=\"$msgtext\" -> state=\"$ftp(State)\""
    }

    # In asynchronous mode, should we move on to the next state?
    set nextState 0
	
    # system status replay
    if { [string equal $rc "211"] } {
	if {$VERBOSE} { DisplayMsg $s Ignore/211 }
        return
    }

    # use only the first digit 
    regexp -- "^\[0-9\]?" $rc rc

    if {$VERBOSE} { DisplayMsg $s StateBegin////////($ftp(State)) }

    switch -exact -- $ftp(State) {
        user { 
            switch -exact -- $rc {
                2 {
                    PutsCtrlSock $s "USER $ftp(User)"
                    set ftp(State) passwd
		    Command $ftp(Command) user







<
<



<





|







<





|
<
<







304
305
306
307
308
309
310


311
312
313

314
315
316
317
318
319
320
321
322
323
324
325
326

327
328
329
330
331
332


333
334
335
336
337
338
339
            if {![string equal $ftp(State) "quit_sent"]} {
		set ftp(Error) "Service not available!"
	    }
            CloseDataConn $s
            WaitComplete $s 0
	    Command $ftp(Command) terminated
            catch {unset ftp(State)}


            return
        } else {
	    # Fix SF bug #466746: Incomplete line, do nothing.

	    return	   
	}
    } 
	
    if { $DEBUG } {
        DisplayMsg $s "-> rc=\"$rc\"\n-> msgtext=\"$msgtext\"\n-> state=\"$ftp(State)\""
    }

    # In asynchronous mode, should we move on to the next state?
    set nextState 0
	
    # system status replay
    if { [string equal $rc "211"] } {

        return
    }

    # use only the first digit 
    regexp -- "^\[0-9\]?" $rc rc
	


    switch -exact -- $ftp(State) {
        user { 
            switch -exact -- $rc {
                2 {
                    PutsCtrlSock $s "USER $ftp(User)"
                    set ftp(State) passwd
		    Command $ftp(Command) user
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
                }
            }
        }
        list_close {
            switch -exact -- $rc {
                1 {}
		2 {
		    # Sync control sequencer to active data connection
		    # before stepping out
		    WaitDataConn $s

		    set nextState 1
		    if {[info exists ftp(NextState)] && ![llength $ftp(NextState)]} {
			Command $ftp(Command) list [ListPostProcess $ftp(List)]
		    } else {
			set complete_with 1
		    }
                }







<
<
<
<







534
535
536
537
538
539
540




541
542
543
544
545
546
547
                }
            }
        }
        list_close {
            switch -exact -- $rc {
                1 {}
		2 {




		    set nextState 1
		    if {[info exists ftp(NextState)] && ![llength $ftp(NextState)]} {
			Command $ftp(Command) list [ListPostProcess $ftp(List)]
		    } else {
			set complete_with 1
		    }
                }
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
                }
            }
        }
        put_close {
            switch -exact -- $rc {
		1 {
		    # Keep going
		    if {$VERBOSE} { DisplayMsg $s put_close/1--continue }
		    return
		}
                2 {
		    # Sync control sequencer to active data connection
		    # before stepping out
		    WaitDataConn $s

                    set complete_with 1
		    set nextState 1
		    Command $ftp(Command) put $ftp(RemoteFilename)
                }
                default {
		    DisplayMsg $s "rc = $rc msgtext = \"$msgtext\""
                    set errmsg "Error storing file \"$ftp(RemoteFilename)\" due to \"$msgtext\""







<



<
<
<
<







780
781
782
783
784
785
786

787
788
789




790
791
792
793
794
795
796
                }
            }
        }
        put_close {
            switch -exact -- $rc {
		1 {
		    # Keep going

		    return
		}
                2 {




                    set complete_with 1
		    set nextState 1
		    Command $ftp(Command) put $ftp(RemoteFilename)
                }
                default {
		    DisplayMsg $s "rc = $rc msgtext = \"$msgtext\""
                    set errmsg "Error storing file \"$ftp(RemoteFilename)\" due to \"$msgtext\""
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        append_close {
            switch -exact -- $rc {
                2 {
		    # Sync control sequencer to active data connection
		    # before stepping out
		    WaitDataConn $s

                    set complete_with 1
		    set nextState 1
		    Command $ftp(Command) append $ftp(RemoteFilename)
                }
                default {
                    set errmsg "Error storing file \"$ftp(RemoteFilename)\"!"
                    set complete_with 0







<
<
<
<







852
853
854
855
856
857
858




859
860
861
862
863
864
865
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        append_close {
            switch -exact -- $rc {
                2 {




                    set complete_with 1
		    set nextState 1
		    Command $ftp(Command) append $ftp(RemoteFilename)
                }
                default {
                    set errmsg "Error storing file \"$ftp(RemoteFilename)\"!"
                    set complete_with 0
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
                    set ftp(State) reget_sent
                }
                default {
                    if { [string equal $ftp(Mode) "passive"] } {
                        set errmsg "Error setting PASSIVE mode!"
                    } else {
                        set errmsg "Error setting port!"
                    }
                    set complete_with 0
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        reget_sent {
            switch -exact -- $rc {







|







913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
                    set ftp(State) reget_sent
                }
                default {
                    if { [string equal $ftp(Mode) "passive"] } {
                        set errmsg "Error setting PASSIVE mode!"
                    } else {
                        set errmsg "Error setting port!"
                    }  
                    set complete_with 0
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        reget_sent {
            switch -exact -- $rc {
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        reget_close {
            switch -exact -- $rc {
                2 {
		    # Sync control sequencer to active data connection
		    # before stepping out
		    WaitDataConn $s

                    set complete_with 1
		    set nextState 1
		    Command $ftp(Command) get $ftp(RemoteFilename):$ftp(From):$ftp(To)
		    unset ftp(From) ftp(To)
                }
                default {
                    set errmsg "Error retrieving file \"$ftp(RemoteFilename)\"!"







<
<
<
<







938
939
940
941
942
943
944




945
946
947
948
949
950
951
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        reget_close {
            switch -exact -- $rc {
                2 {




                    set complete_with 1
		    set nextState 1
		    Command $ftp(Command) get $ftp(RemoteFilename):$ftp(From):$ftp(To)
		    unset ftp(From) ftp(To)
                }
                default {
                    set errmsg "Error retrieving file \"$ftp(RemoteFilename)\"!"
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        get_close {
            switch -exact -- $rc {
                2 {
		    # Sync control sequencer to active data connection
		    # before stepping out
		    WaitDataConn $s

                    set complete_with 1
		    set nextState 1
		    if {$ftp(inline)} {
			upvar #0 $ftp(get:varname) returnData
			set returnData $ftp(GetData)
			Command $ftp(Command) get $ftp(GetData)
		    } else {







<
<
<
<







1008
1009
1010
1011
1012
1013
1014




1015
1016
1017
1018
1019
1020
1021
		    Command $ftp(Command) error $errmsg
                }
            }
        }
        get_close {
            switch -exact -- $rc {
                2 {




                    set complete_with 1
		    set nextState 1
		    if {$ftp(inline)} {
			upvar #0 $ftp(get:varname) returnData
			set returnData $ftp(GetData)
			Command $ftp(Command) get $ftp(GetData)
		    } else {
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
            }
        }
	default {
	    error "Unknown state \"$ftp(State)\""
	}
    }

    if {$VERBOSE} { DisplayMsg $s ////////StateDone==>$ftp(State) }

    # finish waiting 
    if { [info exists complete_with] } {
	if {$VERBOSE} { DisplayMsg $s WaitBegin////////($complete_with) }

        WaitComplete $s $complete_with

	if {$VERBOSE} { DisplayMsg $s ////////WaitDone }
    }

    # display control channel message
    if { [info exists buffer] } {
        if { $VERBOSE } {
            foreach line [split $buffer \n] {
                DisplayMsg $s "C: $line" control
            }
        }
    }
	
    # Rather than throwing an error in the event loop, set the ftp(Error)
    # variable to hold the message so that it can later be thrown after the
    # the StateHandler has completed.

    if { [info exists errmsg] } {
        set ftp(Error) $errmsg
    }

    # If operating asynchronously, commence next state
    if {$VERBOSE} {
	DisplayMsg $s "ns=$nextState, NS=[info exists ftp(NextState)], NSlen=[expr {[info exists ftp(NextState)] && [llength $ftp(NextState)]}]"
    }
    if {$nextState && [info exists ftp(NextState)] && [llength $ftp(NextState)]} {
	# Pop the head of the NextState queue
	if {$VERBOSE} { DisplayMsg $s Sequence=($ftp(NextState)) }

	set ftp(State)     [lindex   $ftp(NextState) 0]
	set ftp(NextState) [lreplace $ftp(NextState) 0 0]

	if {$VERBOSE} { DisplayMsg $s Recurse/StateHandler }
	StateHandler $s
    }

    # enable fileevent on control socket again
    #fileevent $ftp(CtrlSock) readable [list ::ftp::StateHandler $ftp(CtrlSock)]

    if {$VERBOSE} { DisplayMsg $s ======/HandlerDone }
    return
}

#############################################################################
#
# Type --
#
# REPRESENTATION TYPE - Sets the file transfer type to ascii or binary.







<
<


<
<

<
<




















<
<
<


<
<
|

<
<






<
<







1030
1031
1032
1033
1034
1035
1036


1037
1038


1039


1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059



1060
1061


1062
1063


1064
1065
1066
1067
1068
1069


1070
1071
1072
1073
1074
1075
1076
            }
        }
	default {
	    error "Unknown state \"$ftp(State)\""
	}
    }



    # finish waiting 
    if { [info exists complete_with] } {


        WaitComplete $s $complete_with


    }

    # display control channel message
    if { [info exists buffer] } {
        if { $VERBOSE } {
            foreach line [split $buffer \n] {
                DisplayMsg $s "C: $line" control
            }
        }
    }
	
    # Rather than throwing an error in the event loop, set the ftp(Error)
    # variable to hold the message so that it can later be thrown after the
    # the StateHandler has completed.

    if { [info exists errmsg] } {
        set ftp(Error) $errmsg
    }

    # If operating asynchronously, commence next state



    if {$nextState && [info exists ftp(NextState)] && [llength $ftp(NextState)]} {
	# Pop the head of the NextState queue


	set ftp(State) [lindex $ftp(NextState) 0]
	set ftp(NextState) [lreplace $ftp(NextState) 0 0]


	StateHandler $s
    }

    # enable fileevent on control socket again
    #fileevent $ftp(CtrlSock) readable [list ::ftp::StateHandler $ftp(CtrlSock)]



}

#############################################################################
#
# Type --
#
# REPRESENTATION TYPE - Sets the file transfer type to ascii or binary.
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
# Arguments:
# dir - 		directory to list 
# 
# Returns:
# sorted list of files or {} if listing fails

proc ::ftp::NList {s { dir ""}} {
    variable VERBOSE
    upvar ::ftp::ftp$s ftp

    if {$VERBOSE} { DisplayMsg $s NList($s)($dir)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }

    if { ![info exists ftp(State)] } {
        if { ![string is digit -strict $s] } {
            DisplayMsg $s "Bad connection name \"$s\"" error
        } else {
            DisplayMsg $s "Not connected!" error
        }
        return {}
    }

    set ftp(List) {}
    if { $dir == "" } {
        set ftp(Dir) ""
    } else {
        set ftp(Dir) " $dir"
    }

    # save current type and force ascii mode
    set old_type $ftp(Type)
    if { $ftp(Type) != "ascii" } {
	if {$VERBOSE} { DisplayMsg $s NList/ForceAscii }

	if {[string length $ftp(Command)]} {
	    set ftp(NextState) [list nlist_$ftp(Mode) type_change list_last]
	    set ftp(type:changeto) $old_type
	    Type $s ascii
	    return {}
	}
        Type $s ascii
    }

    set ftp(State) nlist_$ftp(Mode)

    if {$VERBOSE} { DisplayMsg $s NList/Process~~~~~~~~~~~~~~~~~~~ }
    StateHandler $s

    if {$VERBOSE} { DisplayMsg $s NList/Processed~~~~~~~~~~~~~~~~~ }

    # wait for synchronization
    set rc [WaitOrTimeout $s]

    # restore old type
    if {$VERBOSE} { DisplayMsg $s NList/RestoreType~~~~~~~~~~~~~~~~~~~~~ }
    if { [Type $s] != $old_type } {
        Type $s $old_type
    }

    unset ftp(Dir)
    if { $rc } {
	if {$VERBOSE} { DisplayMsg $s NList/ReturnData~~~~~~~~~~~~~~~~~~~~~~~ }

	return [lsort [split [string trim $ftp(List) \n] \n]]
    } else {
	if {$VERBOSE} { DisplayMsg $s NList/CDC~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }

        CloseDataConn $s
        return {}
    }

    if {$VERBOSE} { DisplayMsg $s ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~NList/Done }
}

#############################################################################
#
# List --
#
# LIST - This command causes a list to be sent from the server







<


<
<



















<
<










<
<


<
<




<






<
<


<
<



<
<







1133
1134
1135
1136
1137
1138
1139

1140
1141


1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160


1161
1162
1163
1164
1165
1166
1167
1168
1169
1170


1171
1172


1173
1174
1175
1176

1177
1178
1179
1180
1181
1182


1183
1184


1185
1186
1187


1188
1189
1190
1191
1192
1193
1194
# Arguments:
# dir - 		directory to list 
# 
# Returns:
# sorted list of files or {} if listing fails

proc ::ftp::NList {s { dir ""}} {

    upvar ::ftp::ftp$s ftp



    if { ![info exists ftp(State)] } {
        if { ![string is digit -strict $s] } {
            DisplayMsg $s "Bad connection name \"$s\"" error
        } else {
            DisplayMsg $s "Not connected!" error
        }
        return {}
    }

    set ftp(List) {}
    if { $dir == "" } {
        set ftp(Dir) ""
    } else {
        set ftp(Dir) " $dir"
    }

    # save current type and force ascii mode
    set old_type $ftp(Type)
    if { $ftp(Type) != "ascii" } {


	if {[string length $ftp(Command)]} {
	    set ftp(NextState) [list nlist_$ftp(Mode) type_change list_last]
	    set ftp(type:changeto) $old_type
	    Type $s ascii
	    return {}
	}
        Type $s ascii
    }

    set ftp(State) nlist_$ftp(Mode)


    StateHandler $s



    # wait for synchronization
    set rc [WaitOrTimeout $s]

    # restore old type

    if { [Type $s] != $old_type } {
        Type $s $old_type
    }

    unset ftp(Dir)
    if { $rc } {


	return [lsort [split [string trim $ftp(List) \n] \n]]
    } else {


        CloseDataConn $s
        return {}
    }


}

#############################################################################
#
# List --
#
# LIST - This command causes a list to be sent from the server
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
    # from the caller. Closing it is not our responsibility.

    if {[info exists ftp(get:channel)]} {
	catch {unset ftp(get:channel)}
	catch {unset ftp(DestCI)}
    }

    catch { unset ftp(AC) }
    catch {after cancel $ftp(Wait)}
    catch {fileevent $ftp(DataSock) readable {}}
    catch {close $ftp(DataSock); unset ftp(DataSock)}
    catch {close $ftp(DestCI); unset ftp(DestCI)} 
    catch {close $ftp(SourceCI); unset ftp(SourceCI)}
    catch {close $ftp(DummySock); unset ftp(DummySock)}
    return







<







2753
2754
2755
2756
2757
2758
2759

2760
2761
2762
2763
2764
2765
2766
    # from the caller. Closing it is not our responsibility.

    if {[info exists ftp(get:channel)]} {
	catch {unset ftp(get:channel)}
	catch {unset ftp(DestCI)}
    }


    catch {after cancel $ftp(Wait)}
    catch {fileevent $ftp(DataSock) readable {}}
    catch {close $ftp(DataSock); unset ftp(DataSock)}
    catch {close $ftp(DestCI); unset ftp(DestCI)} 
    catch {close $ftp(SourceCI); unset ftp(SourceCI)}
    catch {close $ftp(DummySock); unset ftp(DummySock)}
    return
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
#			of the client's host,
# port -		the client's port number

proc ::ftp::InitDataConn {s sock addr port} {
    upvar ::ftp::ftp$s ftp
    variable VERBOSE

    if { $VERBOSE } {
        DisplayMsg $s "D: New Connection from $addr:$port" data
        DisplayMsg $s "D: Sequencer state $ftp(State)" data
    }

    # If the new channel is accepted, the dummy channel will be closed

    catch {close $ftp(DummySock); unset ftp(DummySock)}

    set ftp(state.data) 0

    # Configure translation and blocking modes







<
<
<
<
<







2780
2781
2782
2783
2784
2785
2786





2787
2788
2789
2790
2791
2792
2793
#			of the client's host,
# port -		the client's port number

proc ::ftp::InitDataConn {s sock addr port} {
    upvar ::ftp::ftp$s ftp
    variable VERBOSE






    # If the new channel is accepted, the dummy channel will be closed

    catch {close $ftp(DummySock); unset ftp(DummySock)}

    set ftp(state.data) 0

    # Configure translation and blocking modes
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
        }
	default {
	    error "Unknown state \"$ftp(State)\""
	}
    }

    if { $VERBOSE } {
        DisplayMsg $s "D: ... Connection from $addr:$port ... initialized" data
    }

    # Marker for WaitDataConn
    set ftp(AC) 1
    return
}

#############################################################################
#
# WaitDataConn --
# Arguments: The ftp connection handle
# Returns:   None
#
# Synchronizes the control sequencer to the data connection (active
# mode). This must be placed at the end of all state sequences,
# i.e. the last state of each sequence, dealing with a data
# connection. Without the sync the control sequencer may step to the
# next command causing a very late-coming data connection to encounter
# an unknown state, and failing to establish what to do.
#
# Sync is achieved through the state field AC, in cooperation with the
# procedures OpenActiveConn and InitDataConn.
#
# Missing field => Not an active connection - Ignore
# AC == 0       => OAC has run, IDC not     - Wait for IDC, then cleanup
# AC == 1       => OAC has run, IDC as well - No waiting, just cleanup.

proc ::ftp::WaitDataConn {s} {
    variable VERBOSE
    upvar ::ftp::ftp$s ftp

    if {$VERBOSE} { DisplayMsg $s WDC|$s|Begin|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }

    # Passive connection, nothing to do
    if {![info exists ftp(AC)]} {
	if {$VERBOSE} { DisplayMsg $s WDC|$s|Passive|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }
	return
    }

    # InitDataConn has not run yet. Wait!
    if {!$ftp(AC)} {
	if {$VERBOSE} { DisplayMsg $s WDC|$s|Sync|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }
	vwait ::ftp::ftp${s}(AC)
	# assert ftp(AC) == 1
	if {$VERBOSE} { DisplayMsg $s WDC|$s|Synced|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }
    } ; # else: Was run already

    if {$VERBOSE} { DisplayMsg $s WDC|$s|Cleanup|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }
    # InitDataConn has run, clean up and continue
    unset ftp(AC)
    return
}

#############################################################################
#
# OpenActiveConn --
#







|

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







2835
2836
2837
2838
2839
2840
2841
2842
2843

















































2844
2845
2846
2847
2848
2849
2850
        }
	default {
	    error "Unknown state \"$ftp(State)\""
	}
    }

    if { $VERBOSE } {
        DisplayMsg $s "D: Connection from $addr:$port" data
    }

















































    return
}

#############################################################################
#
# OpenActiveConn --
#
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033

    set p [lindex [fconfigure $ftp(DummySock) -sockname] 2]
    if { $VERBOSE } {
        DisplayMsg $s "D: Port is $p" data
    }
    set ftp(DataPort) "[expr {$p / 256}],[expr {$p % 256}]"

    # Marker for WaitDataConn
    set ftp(AC) 0
    return 1
}

#############################################################################
#
# OpenPassiveConn --
#







<
<







2881
2882
2883
2884
2885
2886
2887


2888
2889
2890
2891
2892
2893
2894

    set p [lindex [fconfigure $ftp(DummySock) -sockname] 2]
    if { $VERBOSE } {
        DisplayMsg $s "D: Port is $p" data
    }
    set ftp(DataPort) "[expr {$p / 256}],[expr {$p % 256}]"



    return 1
}

#############################################################################
#
# OpenPassiveConn --
#
3152
3153
3154
3155
3156
3157
3158
3159
    set ::ftp::VERBOSE 1
    set ::ftp::DEBUG 0
}

# ==================================================================
# At last, everything is fine, we can provide the package.

package provide ftp [lindex {Revision: 2.4.13} 1]







|
3013
3014
3015
3016
3017
3018
3019
3020
    set ::ftp::VERBOSE 1
    set ::ftp::DEBUG 0
}

# ==================================================================
# At last, everything is fine, we can provide the package.

package provide ftp [lindex {Revision: 2.4.12} 1]
Changes to modules/ftp/pkgIndex.tcl.
1
2
3
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded ftp         2.4.13 [list source [file join $dir ftp.tcl]]
package ifneeded ftp::geturl 0.2.1  [list source [file join $dir ftp_geturl.tcl]]

|

1
2
3
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded ftp         2.4.12 [list source [file join $dir ftp.tcl]]
package ifneeded ftp::geturl 0.2.1  [list source [file join $dir ftp_geturl.tcl]]
Changes to modules/html/html.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[comment {-*- tcl -*- doctools manpage}]
[vset HTML_VERSION 1.4.3]
[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 [vset HTML_VERSION]]]
[description]
[para]

The package [package html] provides commands that generate HTML.
These commands typically return an HTML string as their result. In
particular, they do not output their result to [const stdout].


<
|












|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin html n 1.4]
[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]]
[description]
[para]

The package [package html] provides commands that generate HTML.
These commands typically return an HTML string as their result. In
particular, they do not output their result to [const stdout].

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[arg list] should contain an alternating list of labels and values.
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
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







|







58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
[arg list] should contain an alternating list of labels and values.
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
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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300

[emph {Side effect only}].  Call this before [cmd ::html::head] to
define a [term meta] tag for the page.  The [arg args] is a Tcl-style name,
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
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].







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







241
242
243
244
245
246
247













































248
249
250
251
252
253
254

[emph {Side effect only}].  Call this before [cmd ::html::head] to
define a [term meta] tag for the page.  The [arg args] is a Tcl-style name,
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::minorList] [arg list] [opt [arg ordered]]]

Generate an ordered or unordered list of links.  The [arg list] is a
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].
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
Generate a set of [term input] tags of type [term radio] and an associated text
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
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
HEAD section will contain a [term meta] tag that causes the document to







|







302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
Generate a set of [term input] tags of type [term radio] and an associated text
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
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
HEAD section will contain a [term meta] tag that causes the document to
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
[call [cmd ::html::while] [arg {test body}]]

This procedure is similar to the built-in Tcl [cmd while] control
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]
[include ../doctools2base/include/feedback.inc]
[manpage_end]







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<





397
398
399
400
401
402
403






















404
405
406
407
408
[call [cmd ::html::while] [arg {test body}]]

This procedure is similar to the built-in Tcl [cmd while] control
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]

[vset CATEGORY html]
[include ../doctools2base/include/feedback.inc]
[manpage_end]
Changes to modules/html/html.tcl.
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# Originally by Brent Welch, with help from Dan Kuchler and Melissa Chawla

package require Tcl 8.2
package require ncgi
package provide html 1.4.3

namespace eval ::html {

    # State about the current page

    variable page








|







11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# Originally by Brent Welch, with help from Dan Kuchler and Melissa Chawla

package require Tcl 8.2
package require ncgi
package provide html 1.4

namespace eval ::html {

    # State about the current page

    variable page

506
507
508
509
510
511
512
513
514
515
516
517
518
519
520

proc ::html::refresh {content {url {}}} {
    variable page
    ::set html "<meta http-equiv=\"Refresh\" content=\"$content"
    ::if {[string length $url]} {
	append html "; url=$url"
    }
    append html "\">"
    lappend page(meta) $html
    return ""
}

# ::html::headTag
#
#	Embed a tag into the HEAD section







|







506
507
508
509
510
511
512
513
514
515
516
517
518
519
520

proc ::html::refresh {content {url {}}} {
    variable page
    ::set html "<meta http-equiv=\"Refresh\" content=\"$content"
    ::if {[string length $url]} {
	append html "; url=$url"
    }
    append html "\">\n"
    lappend page(meta) $html
    return ""
}

# ::html::headTag
#
#	Embed a tag into the HEAD section
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
# Arguments:
#	s	The near-HTML text
#
# Results:
#	The text with <br> in place of line-endings.

proc ::html::nl2br {s} {
    return [string map [list \n\r <br> \r\n <br> \n <br> \r <br>] $s]
}

# ::html::doctype
#	Create the DOCTYPE tag and tuck it away for usage
#
# Arguments:
#	arg	The DOCTYPE you want to declare
#
# Results:
#	HTML for the doctype section

proc ::html::doctype {arg} {
    variable doctypes
    ::set code [string toupper $arg]
    ::if {![info exists doctypes($code)]} {
	return -code error -errorcode {HTML DOCTYPE BAD} \
	    "Unknown doctype \"$arg\""
    }
    return $doctypes($code)
}

namespace eval ::html {
    variable  doctypes
    array set doctypes {







|













|
|
<
|







1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423

1424
1425
1426
1427
1428
1429
1430
1431
# Arguments:
#	s	The near-HTML text
#
# Results:
#	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]
}

# ::html::doctype
#	Create the DOCTYPE tag and tuck it away for usage
#
# Arguments:
#	arg	The DOCTYPE you want to declare
#
# Results:
#	HTML for the doctype section

proc ::html::doctype {arg} {
    variable doctypes
    set code [string toupper $arg]
    if {![info exists doctypes($code)]} {

	return -code error "Unknown doctype \"$arg\""
    }
    return $doctypes($code)
}

namespace eval ::html {
    variable  doctypes
    array set doctypes {
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458

1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488

1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
# ::html::css
#	Create the text/css tag and tuck it away for usage
#
# Arguments:
#	href	The location of the css file to include the filename and path
#
# Results:
#	None.

proc ::html::css {href} {
    variable page

    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
}

# ::html::js
#   Create the text/javascript tag and tuck it away for usage
#
# Arguments:
#	href	The location of the javascript file to include the filename and path
#
# Results:
#	None.

proc ::html::js {href} {
    variable page

    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
}







|



>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










|



>
|


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459















1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477















# ::html::css
#	Create the text/css tag and tuck it away for usage
#
# Arguments:
#	href	The location of the css file to include the filename and path
#
# Results:
#	HTML for the  section

proc ::html::css {href} {
    variable page
    set page(css) \
	"<link rel=\"stylesheet\" type=\"text/css\" href=\"[quoteFormValue $href]\">\n"















    return
}

# ::html::js
#   Create the text/javascript tag and tuck it away for usage
#
# Arguments:
#	href	The location of the javascript file to include the filename and path
#
# Results:
#	HTML for the  section

proc ::html::js {href} {
    variable page
    set page(js) \
	"<script language=\"javascript\" type=\"text/javascript\" src=\"[quoteFormValue $href]\"></script>\n"
    return
}















Changes to modules/html/html.test.
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.4
testsNeedTcltest 2.0

testing {
    useLocal html.tcl html
}

# -------------------------------------------------------------------------

test html-1.1 {html::init} -body {
    html::init
    list \
	[array exists html::defaults] \
	[array size   html::defaults] \
	[info exists  html::page]
} -result {1 0 0}

test html-1.2 {html::init} -body {
    html::init {
	font.face	arial
	body.bgcolor	white
	body.text	black
    }
    lsort [array names html::defaults]
} -result {body.bgcolor body.text font.face}

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, 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, not enough args} -body {
    html::head
} -returnCodes error -result {wrong # args: should be "html::head title"}

test html-2.2 {html::head} -body {
    html::head "The Title"
} -result "<html><head>\n\t<title>The Title</title>\n</head>\n"

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"
} -result {<html><head>
	<title>The Title</title>
	<!-- Cathy Coder -->
	<meta name="description" content="The Description">
	<meta name="keywords" content="key, word">
	<meta name="metakey" content="metavalue">
</head>
}

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} -body {
    html::title "blah blah"
} -result "<title>blah blah</title>\n"

test html-4.1 {html::getTitle} -body {
    html::init
    html::getTitle
} -result ""

test html-4.2 {html::getTitle} -body {
    html::init
    html::title "blah blah"
    html::getTitle
} -result {blah blah}

test html-5.1 {html::meta} {
    html::init
    html::meta one two
} {}

test html-5.2 {html::meta} {







|
|







|

<
|
|
|
|

|






|

|
|
|

|
|
|

|
|
|

|

|

|





|








|
|
|

|

|

|


|

|



|







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.2
testsNeedTcltest 1.0

testing {
    useLocal html.tcl html
}

# -------------------------------------------------------------------------

test html-1.1 {html::init} {
    html::init

    list [array exists html::defaults] \
	[array size html::defaults] \
	[info exists html::page]
} {1 0 0}

test html-1.2 {html::init} {
    html::init {
	font.face	arial
	body.bgcolor	white
	body.text	black
    }
    lsort [array names html::defaults]
} {body.bgcolor body.text font.face}

test html-1.3 {html::init} {
    catch {html::init wrong num args}
} 1

test html-1.4 {html::init} {
    catch {html::init {wrong num args}}
} 1

test html-2.1 {html::head} {
    catch {html::head}
} 1

test html-2.2 {html::head} {
    html::head "The Title"
} "<html><head>\n\t<title>The Title</title>\n</head>\n"

test html-2.3 {html::head} {
    html::description "The Description"
    html::keywords key word
    html::author "Cathy Coder"
    html::meta metakey metavalue
    html::head "The Title"
} {<html><head>
	<title>The Title</title>
	<!-- Cathy Coder -->
	<meta name="description" content="The Description">
	<meta name="keywords" content="key, word">
	<meta name="metakey" content="metavalue">
</head>
}

test html-3.1 {html::title} {
    catch html::title
} 1

test html-3.2 {html::title} {
    html::title "blah blah"
} "<title>blah blah</title>\n"

test html-4.1 {html::getTitle} {
    html::init
    html::getTitle
} ""

test html-4.2 {html::getTitle} {
    html::init
    html::title "blah blah"
    html::getTitle
} {blah blah}

test html-5.1 {html::meta} {
    html::init
    html::meta one two
} {}

test html-5.2 {html::meta} {
513
514
515
516
517
518
519

520
521
522
523
524
525
526
527
528

529
530
531
532
533
534
535
test html-26.4 {html::refresh} {
    html::init
    html::refresh 4
    html::head title
} {<html><head>
	<title>title</title>
	<meta http-equiv="Refresh" content="4">

</head>
}
test html-26.5 {html::refresh} {
    html::init
    html::refresh 9 http://www.scriptics.com
    html::head title
} {<html><head>
	<title>title</title>
	<meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">

</head>
}

test html-27.1 {html::foreach--1 var, 1 iteration} {
    html::foreach x {a} {<td>$x</td>}
} {<td>a</td>}








>









>







512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
test html-26.4 {html::refresh} {
    html::init
    html::refresh 4
    html::head title
} {<html><head>
	<title>title</title>
	<meta http-equiv="Refresh" content="4">

</head>
}
test html-26.5 {html::refresh} {
    html::init
    html::refresh 9 http://www.scriptics.com
    html::head title
} {<html><head>
	<title>title</title>
	<meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">

</head>
}

test html-27.1 {html::foreach--1 var, 1 iteration} {
    html::foreach x {a} {<td>$x</td>}
} {<td>a</td>}

789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812

813

814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
} {{} 1}

test html-32.1 {single argument} {
    set x 0
    set result [html::eval {set x [format 22]}]
    list $result $x
} {{} 22}

test html-32.2 {multiple arguments} {
    set a {$b}
    set b xyzzy
    set x 0
    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} -body {

    html::eval

} -returnCodes error -result {wrong # args: should be "uplevel ?level? command ?arg ...?"}

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} -body {
    html::font size=18
} -result {<font size=18>}

test html-34.0 {html::nl2br} -body {
    html::nl2br "a\n\rb\nc\rd"
} -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







<







<






<
|
>
|
>
|
<
|
|
<
|
<
<
<
|
<
<
<
|
<
<
<
|
<
<
<
|
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
<
<
<
<
<
<
<
<
<
<
<
|
<
|
|
<
<
<
<
<
<
<
<
<
<
<

<
<
|
<
<
<
<
<
|
<
<
<
<
<
<
<
|
<
<


<
|
<
|
<
<
<
|
<
<
<

<
<
<

<

790
791
792
793
794
795
796

797
798
799
800
801
802
803

804
805
806
807
808
809

810
811
812
813
814

815
816

817



818



819



820



821

822









































823












824

825
826











827


828





829







830


831
832

833

834



835



836



837

838
} {{} 1}

test html-32.1 {single argument} {
    set x 0
    set result [html::eval {set x [format 22]}]
    list $result $x
} {{} 22}

test html-32.2 {multiple arguments} {
    set a {$b}
    set b xyzzy
    set x 0
    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-33.0 {html::font} {

    html::font
} {}














test html-33.1 {html::font} {





    html::font size=18







} {<font size=18>}





test html-34.0 {html::nl2br} {

    html::nl2br "a\n\rb\nc\rd"



} {a<br>b<br>c<br>d}









testsuiteCleanup
Changes to modules/html/pkgIndex.tcl.
1
2
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded html 1.4.3 [list source [file join $dir html.tcl]]

|
1
2
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded html 1.4 [list source [file join $dir html.tcl]]
Changes to modules/json/json.bench.
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

    bench_puts "=== === === === === ==="
    bench_puts "=== === === $impl ==="
    bench_puts "=== === === === === ==="

    bench_puts {=== test-data =========}

    foreach f [glob -nocomplain -directory $self/tests *.json] {
	set in [cat $f]

	bench -desc "parse [file rootname [file tail $f]] ($impl)" -body {
	    json::json2dict $in
	}

	bench -desc "validate [file rootname [file tail $f]] ($impl)" -body {
	    json::validate $in
	}
    }

    foreach f [glob -nocomplain -directory $self/tests *.bench] {
	set in [cat $f]

	bench -desc "parse [file rootname [file tail $f]] ($impl)" -body {
	    json::json2dict $in
	}

	bench -desc "validate [file rootname [file tail $f]] ($impl)" -body {







|











|







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

    bench_puts "=== === === === === ==="
    bench_puts "=== === === $impl ==="
    bench_puts "=== === === === === ==="

    bench_puts {=== test-data =========}

    foreach f [glob -nocomplain -directory $self/test-data *.json] {
	set in [cat $f]

	bench -desc "parse [file rootname [file tail $f]] ($impl)" -body {
	    json::json2dict $in
	}

	bench -desc "validate [file rootname [file tail $f]] ($impl)" -body {
	    json::validate $in
	}
    }

    foreach f [glob -nocomplain -directory $self/test-data *.bench] {
	set in [cat $f]

	bench -desc "parse [file rootname [file tail $f]] ($impl)" -body {
	    json::json2dict $in
	}

	bench -desc "validate [file rootname [file tail $f]] ($impl)" -body {
Changes to modules/json/json.test.
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     [expr {[catch {package require dict}] ? "8.5" : "8.4"}]
testsNeedTcltest 2.0

support {
    useLocalFile tests/support.tcl
}

testing {
    useAccel [useTcllibC] json/json.tcl json
    TestAccelInit                       json
}








|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     [expr {[catch {package require dict}] ? "8.5" : "8.4"}]
testsNeedTcltest 2.0

support {
    useLocalFile test_support.tcl
}

testing {
    useAccel [useTcllibC] json/json.tcl json
    TestAccelInit                       json
}

Changes to modules/json/json_write.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[comment {-*- tcl -*- doctools manpage}]
[vset PACKAGE_VERSION 1.0.3]
[manpage_begin json::write n [vset PACKAGE_VERSION]]
[keywords {data exchange}]
[keywords {exchange format}]
[keywords javascript]
[keywords json]
[copyright {2009-2013 Andreas Kupries <[email protected]>}]
[moddesc   {JSON}]
[titledesc {JSON generation}]
[category  {CGI programming}]
[require Tcl 8.5]
[require json::write [opt [vset PACKAGE_VERSION]]]
[description]
[para]

The [package json::write] package provides a simple Tcl-only library
for generation of text in the JSON [uri http://www.json.org/] data
exchange format as specified in
RFC 4627 [uri http://www.ietf.org/rfc/rfc4627.txt].

<
|









|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin json::write n 1.0.2]
[keywords {data exchange}]
[keywords {exchange format}]
[keywords javascript]
[keywords json]
[copyright {2009-2013 Andreas Kupries <[email protected]>}]
[moddesc   {JSON}]
[titledesc {JSON generation}]
[category  {CGI programming}]
[require Tcl 8.5]
[require json::write [opt 1.0.2]]
[description]
[para]

The [package json::write] package provides a simple Tcl-only library
for generation of text in the JSON [uri http://www.json.org/] data
exchange format as specified in
RFC 4627 [uri http://www.ietf.org/rfc/rfc4627.txt].
Changes to modules/json/json_write.tcl.
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
    # 1 1 | Indented + vertically aligned keys
    # - - + ---------------------

    variable indented 1
    variable aligned  1

    variable quotes \
	[list "\"" "\\\"" \\ \\\\ \b \\b \f \\f \n \\n \r \\r \t \\t \
	     \x00 \\u0000 \x01 \\u0001 \x02 \\u0002 \x03 \\u0003 \
	     \x04 \\u0004 \x05 \\u0005 \x06 \\u0006 \x07 \\u0007 \
	     \x0b \\u000b \x0e \\u000e \x0f \\u000f \x10 \\u0010 \
	     \x11 \\u0011 \x12 \\u0012 \x13 \\u0013 \x14 \\u0014 \
	     \x15 \\u0015 \x16 \\u0016 \x17 \\u0017 \x18 \\u0018 \
	     \x19 \\u0019 \x1a \\u001a \x1b \\u001b \x1c \\u001c \
	     \x1d \\u001d \x1e \\u001e \x1f \\u001f \x7f \\u007f \
	     \x80 \\u0080 \x81 \\u0081 \x82 \\u0082 \x83 \\u0083 \
	     \x84 \\u0084 \x85 \\u0085 \x86 \\u0086 \x87 \\u0087 \
	     \x88 \\u0088 \x89 \\u0089 \x8a \\u008a \x8b \\u008b \
	     \x8c \\u008c \x8d \\u008d \x8e \\u008e \x8f \\u008f \
	     \x90 \\u0090 \x91 \\u0091 \x92 \\u0092 \x93 \\u0093 \
	     \x94 \\u0094 \x95 \\u0095 \x96 \\u0096 \x97 \\u0097 \
	     \x98 \\u0098 \x99 \\u0099 \x9a \\u009a \x9b \\u009b \
	     \x9c \\u009c \x9d \\u009d \x9e \\u009e \x9f \\u009f ]
}

# ### ### ### ######### ######### #########
## Ready

package provide json::write 1.0.3
return







|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<





|

171
172
173
174
175
176
177
178















179
180
181
182
183
184
185
    # 1 1 | Indented + vertically aligned keys
    # - - + ---------------------

    variable indented 1
    variable aligned  1

    variable quotes \
	[list "\"" "\\\"" \\ \\\\ \b \\b \f \\f \n \\n \r \\r \t \\t]















}

# ### ### ### ######### ######### #########
## Ready

package provide json::write 1.0.2
return
Changes to modules/json/json_write.test.
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

test json-write-2.4 {argument errors} -body {
    json::write object A
} -returnCodes 1 -result {wrong # args, expected an even number of arguments}

# -------------------------------------------------------------------------

test json-write-3.0 {indented, aligned} -setup {
    json::write indented 1
    json::write aligned  1
} -body {
    gen $data
} -result {{
    "grammar" : {
        "rules" : {
            "A" : {
                "is"   : "/ {t +} {t -}",
                "mode" : "value"







|


<







99
100
101
102
103
104
105
106
107
108

109
110
111
112
113
114
115

test json-write-2.4 {argument errors} -body {
    json::write object A
} -returnCodes 1 -result {wrong # args, expected an even number of arguments}

# -------------------------------------------------------------------------

test json-write-3.0 {indented, aligned} -body {
    json::write indented 1
    json::write aligned  1

    gen $data
} -result {{
    "grammar" : {
        "rules" : {
            "A" : {
                "is"   : "/ {t +} {t -}",
                "mode" : "value"
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
                "mode" : "value"
            }
        },
        "start" : "n Expression"
    }
}}

test json-write-3.1 {indented, !aligned} -setup {
    json::write indented 1
    json::write aligned  0
} -body {
    gen $data
} -result {{
    "grammar" : {
        "rules" : {
            "A" : {
                "is" : "/ {t +} {t -}",
                "mode" : "value"







|


<







143
144
145
146
147
148
149
150
151
152

153
154
155
156
157
158
159
                "mode" : "value"
            }
        },
        "start" : "n Expression"
    }
}}

test json-write-3.1 {indented, !aligned} -body {
    json::write indented 1
    json::write aligned  0

    gen $data
} -result {{
    "grammar" : {
        "rules" : {
            "A" : {
                "is" : "/ {t +} {t -}",
                "mode" : "value"
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
                "mode" : "value"
            }
        },
        "start" : "n Expression"
    }
}}

test json-write-3.1 {!indented, !aligned} -setup {
    json::write indented 0
    json::write aligned  0
} -body {
    gen $data
} -result {{"grammar":{"rules":{"A":{"is":"/ {t +} {t -}","mode":"value"},"D":{"is":"/ {t 0} {t 1} ","mode":"value"},"E":{"is":"/ {x {t (} {n E} {t )}} {x {n F} {* {x {n M} {n F}}}}","mode":"value"},"F":{"is":"x {n T} {* {x {n A} {n T}}}","mode":"value"},"M":{"is":"/ {t *} {t /}","mode":"value"},"N":{"is":"x {? {n S}} {+ {n D}}","mode":"value"},"S":{"is":"/ {t +} {t -}","mode":"value"},"T":{"is":"n N","mode":"value"}},"start":"n Expression"}}}


# -------------------------------------------------------------------------

test json-write-4.0 {string quoting} -body {
    json::write string "a\"b\\c\bd\fe\nf\rg\th\0i\1j\2k\3l\177m"
} -result "\"a\\\"b\\\\c\\bd\\fe\\nf\\rg\\th\\u0000i\\u0001j\\u0002k\\u0003l\\u007fm\""

# -------------------------------------------------------------------------
unset data
rename gen {}
testsuiteCleanup

# Local Variables:
#  mode: tcl
#  indent-tabs-mode: nil
# End:







|


<



<
<
<
<
<
<
<









187
188
189
190
191
192
193
194
195
196

197
198
199







200
201
202
203
204
205
206
207
208
                "mode" : "value"
            }
        },
        "start" : "n Expression"
    }
}}

test json-write-3.1 {!indented, !aligned} -body {
    json::write indented 0
    json::write aligned  0

    gen $data
} -result {{"grammar":{"rules":{"A":{"is":"/ {t +} {t -}","mode":"value"},"D":{"is":"/ {t 0} {t 1} ","mode":"value"},"E":{"is":"/ {x {t (} {n E} {t )}} {x {n F} {* {x {n M} {n F}}}}","mode":"value"},"F":{"is":"x {n T} {* {x {n A} {n T}}}","mode":"value"},"M":{"is":"/ {t *} {t /}","mode":"value"},"N":{"is":"x {? {n S}} {+ {n D}}","mode":"value"},"S":{"is":"/ {t +} {t -}","mode":"value"},"T":{"is":"n N","mode":"value"}},"start":"n Expression"}}}








# -------------------------------------------------------------------------
unset data
rename gen {}
testsuiteCleanup

# Local Variables:
#  mode: tcl
#  indent-tabs-mode: nil
# End:
Changes to modules/json/pkgIndex.tcl.
1
2
3
4
5
6
7
# Tcl package index file, version 1.1

if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded json 1.3.2 [list source [file join $dir json.tcl]]

if {![package vsatisfies [package provide Tcl] 8.5]} {return}
package ifneeded json::write 1.0.3 [list source [file join $dir json_write.tcl]]






|
1
2
3
4
5
6
7
# Tcl package index file, version 1.1

if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded json 1.3.2 [list source [file join $dir json.tcl]]

if {![package vsatisfies [package provide Tcl] 8.5]} {return}
package ifneeded json::write 1.0.2 [list source [file join $dir json_write.tcl]]
Added modules/json/test-data/array.json.












































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
      {
         "precision": "zip",
         "Latitude":  37.7668,
         "Longitude": -122.3959,
         "Address":   "",
         "City":      "SAN FRANCISCO",
         "State":     "CA",
         "Zip":       "94107",
         "Country":   "US"
      },
      {
         "precision": "zip",
         "Latitude":  37.371991,
         "Longitude": -122.026020,
         "Address":   "",
         "City":      "SUNNYVALE",
         "State":     "CA",
         "Zip":       "94085",
         "Country":   "US"
      }
     ]
Added modules/json/test-data/array.result.


>
1
{precision zip Latitude 37.7668 Longitude -122.3959 Address {} City {SAN FRANCISCO} State CA Zip 94107 Country US} {precision zip Latitude 37.371991 Longitude -122.026020 Address {} City SUNNYVALE State CA Zip 94085 Country US}
Added modules/json/test-data/array.sort.


>
1
list dict
Added modules/json/test-data/glossary.json.






























>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
    "glossary": {
        "title": "example glossary",
        "mixlist": ["a \"\" str", -0.09, null, "", {"member":true}],
        "GlossDiv": {
            "title": "S",
            "GlossList": [{
                "ID": "SGML",
                "GlossTerm": "Standard \\\" Language",
                "Acronym": "SGML\\",
                "Abbrev": "ISO 8879:1986",
                "GlossDef":
                "A meta-markup language, used ...",
                "GlossSeeAlso": ["GML", "XML", "markup"]}]}}
}
Added modules/json/test-data/glossary.result.


>
1
glossary {title {example glossary} mixlist {{a "" str} -0.09 null {} {member true}} GlossDiv {title S GlossList {{ID SGML GlossTerm {Standard \" Language} Acronym SGML\\ Abbrev {ISO 8879:1986} GlossDef {A meta-markup language, used ...} GlossSeeAlso {GML XML markup}}}}}
Added modules/json/test-data/glossary.sort.


>
1
dict * {dict GlossDiv {dict GlossList {list dict}}}
Added modules/json/test-data/menu.json.
























>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
{"menu": {
    "id": "file",
    "value": "File:",
    "unival": "\u6021:",
    "popup": {
        "menuitem": [
                     {"value": "Open", "onclick": "OpenDoc()"},
                     {"value": "Close", "onclick": "CloseDoc()"}
                    ]
    }
}
}
Added modules/json/test-data/menu.result.


>
1
menu {id file value File: unival @@@: popup {menuitem {{value Open onclick OpenDoc()} {value Close onclick CloseDoc()}}}}
Added modules/json/test-data/menu.sort.


>
1
dict * {dict popup {dict * {list dict}}}
Added modules/json/test-data/menu2.json.




























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{"menu": {
    "header": "Viewer",
    "items": [
              {"id": "Open"},
              {"id": "OpenNew", "label": "Open New"},
              null,
              {"id": "ZoomIn", "label": "Zoom In"},
              {"id": "ZoomOut", "label": "Zoom Out"},
              null,
              {"id": "Help"},
              {"id": "About", "label": "About Viewer..."}
             ]
}
}
Added modules/json/test-data/menu2.result.


>
1
menu {header Viewer items {{id Open} {id OpenNew label {Open New}} null {id ZoomIn label {Zoom In}} {id ZoomOut label {Zoom Out}} null {id Help} {id About label {About Viewer...}}}}
Added modules/json/test-data/menu2.sort.


>
1
dict * {dict items {list 0 dict 1 dict 3 dict 4 dict 6 dict 7 dict}}
Added modules/json/test-data/widget.json.






































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{"widget": {
    "debug": "on",
    "window": {
        "title":"Sample Widget",
        "name": "main_window",
        "width": 500,
        "height": 500},
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": null,
        "hOffset":250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}
}
Added modules/json/test-data/widget.result.


>
1
widget {debug on window {title {Sample Widget} name main_window width 500 height 500} text {data {Click Here} size 36 style bold name null hOffset 250 vOffset 100 alignment center onMouseUp {sun1.opacity = (sun1.opacity / 100) * 90;}}}
Added modules/json/test-data/widget.sort.


>
1
dict * {dict text dict window dict}
Added modules/json/test_support.tcl.








































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

#use fileutil/fileutil.tcl fileutil

catch {unset JSON}
catch {unset TCL}
catch {unset DICTSORT}

proc dictsort3 {spec data} {
    while [llength $spec] {
        set type [lindex $spec 0]
        set spec [lrange $spec 1 end]
        
        switch -- $type {
            dict {
                lappend spec * string
                
                set json {}
                foreach {key} [lsort [dict keys $data]] {
                    set val [dict get $data $key]
                    foreach {keymatch valtype} $spec {
                        if {[string match $keymatch $key]} {
                            lappend json $key [dictsort3 $valtype $val]
                            break
                        }
                    }
                }
                return $json
            }
            list {
                lappend spec * string
                set json {}
                set idx 0
                foreach {val} $data {
                    foreach {keymatch valtype} $spec {
                        if {$idx == $keymatch || $keymatch eq "*"} {
                            lappend json [dictsort3 $valtype $val]
                            break
                        }
                    }
                    incr idx
                }
                return $json
            }
            string {
                return $data
            }
            default {
		error "Invalid type"
	    }
        }
    }
}

foreach f [TestFilesGlob test-data/*.json] {
    set name [file rootname [file tail $f]]
    set JSON($name) [tcltest::viewFile $f]
}

foreach f [TestFilesGlob test-data/*.result] {
    set name [file rootname [file tail $f]]
    set TCL($name) [tcltest::viewFile $f]
}

foreach f [TestFilesGlob test-data/*.sort] {
    set name [file rootname [file tail $f]]
    set DICTSORT($name) [tcltest::viewFile $f]
}

# Postprocessing result of one test case, insert proper expected unicodepoint
set  TCL(menu) [string map [list @@@ \u6021]  $TCL(menu)]

set JSON(emptyList) {[]}
set  TCL(emptyList) {}

set JSON(emptyList2) {{"menu": []}}
set  TCL(emptyList2) {menu {}}

set JSON(emptyList3) {["menu", []]}
set  TCL(emptyList3) {menu {}}

set JSON(emptyList4) {[[]]}
set  TCL(emptyList4) {{}}

set JSON(escapes) {"\t\r\n\f\b\/\\\""}
set  TCL(escapes) "\t\r\n\f\b/\\\""



foreach f [TestFilesGlob test-data/*.fail] {
    set name [file rootname [file tail $f]]
    set FAIL($name) [tcltest::viewFile $f]
}

foreach f [TestFilesGlob test-data/*.err] {
    set name [file rootname [file tail $f]]
    set ERR($name) [tcltest::viewFile $f]
}

## Tcl has strict escape checking.
## C   uses Tcl_UtfBacklash, and allows lots of irregular escapes.
#
# set FAIL(escape1)        {"\%"}
# set  ERR(escape1-tcl)    {unexpected token "END" at position 0; expecting VALUE}
# set  ERR(escape1-critcl) {syntax error 0 bytes before end, around ``%''}
#
# set FAIL(escape2)        {"\."}
# set  ERR(escape2-tcl)    {unexpected token "END" at position 0; expecting VALUE}
# set  ERR(escape2-critcl) {syntax error 0 bytes before end, around ``.''}



proc resultfor {name} {
    global TCL
    transform $TCL($name) $name
}

proc transform {res name} {
    global DICTSORT
    if {[info exists DICTSORT($name)]} {
        return [dictsort3 $DICTSORT($name) $res]
    } else {
        return $res
    }
}

proc transform* {res args} {
    set t {}
    foreach r $res n $args {
        lappend t [transform $r $n]
    }
    return $t
}
Deleted modules/json/tests/array.json.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
      {
         "precision": "zip",
         "Latitude":  37.7668,
         "Longitude": -122.3959,
         "Address":   "",
         "City":      "SAN FRANCISCO",
         "State":     "CA",
         "Zip":       "94107",
         "Country":   "US"
      },
      {
         "precision": "zip",
         "Latitude":  37.371991,
         "Longitude": -122.026020,
         "Address":   "",
         "City":      "SUNNYVALE",
         "State":     "CA",
         "Zip":       "94085",
         "Country":   "US"
      }
     ]
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































Deleted modules/json/tests/array.result.
1
{precision zip Latitude 37.7668 Longitude -122.3959 Address {} City {SAN FRANCISCO} State CA Zip 94107 Country US} {precision zip Latitude 37.371991 Longitude -122.026020 Address {} City SUNNYVALE State CA Zip 94085 Country US}
<


Deleted modules/json/tests/array.sort.
1
list dict
<


Deleted modules/json/tests/glossary.json.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
    "glossary": {
        "title": "example glossary",
        "mixlist": ["a \"\" str", -0.09, null, "", {"member":true}],
        "GlossDiv": {
            "title": "S",
            "GlossList": [{
                "ID": "SGML",
                "GlossTerm": "Standard \\\" Language",
                "Acronym": "SGML\\",
                "Abbrev": "ISO 8879:1986",
                "GlossDef":
                "A meta-markup language, used ...",
                "GlossSeeAlso": ["GML", "XML", "markup"]}]}}
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























Deleted modules/json/tests/glossary.result.
1
glossary {title {example glossary} mixlist {{a "" str} -0.09 null {} {member true}} GlossDiv {title S GlossList {{ID SGML GlossTerm {Standard \" Language} Acronym SGML\\ Abbrev {ISO 8879:1986} GlossDef {A meta-markup language, used ...} GlossSeeAlso {GML XML markup}}}}}
<


Deleted modules/json/tests/glossary.sort.
1
dict * {dict GlossDiv {dict GlossList {list dict}}}
<


Deleted modules/json/tests/menu.json.
1
2
3
4
5
6
7
8
9
10
11
12
{"menu": {
    "id": "file",
    "value": "File:",
    "unival": "\u6021:",
    "popup": {
        "menuitem": [
                     {"value": "Open", "onclick": "OpenDoc()"},
                     {"value": "Close", "onclick": "CloseDoc()"}
                    ]
    }
}
}
<
<
<
<
<
<
<
<
<
<
<
<
























Deleted modules/json/tests/menu.result.
1
menu {id file value File: unival @@@: popup {menuitem {{value Open onclick OpenDoc()} {value Close onclick CloseDoc()}}}}
<


Deleted modules/json/tests/menu.sort.
1
dict * {dict popup {dict * {list dict}}}
<


Deleted modules/json/tests/menu2.json.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{"menu": {
    "header": "Viewer",
    "items": [
              {"id": "Open"},
              {"id": "OpenNew", "label": "Open New"},
              null,
              {"id": "ZoomIn", "label": "Zoom In"},
              {"id": "ZoomOut", "label": "Zoom Out"},
              null,
              {"id": "Help"},
              {"id": "About", "label": "About Viewer..."}
             ]
}
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























Deleted modules/json/tests/menu2.result.
1
menu {header Viewer items {{id Open} {id OpenNew label {Open New}} null {id ZoomIn label {Zoom In}} {id ZoomOut label {Zoom Out}} null {id Help} {id About label {About Viewer...}}}}
<


Deleted modules/json/tests/menu2.sort.
1
dict * {dict items {list 0 dict 1 dict 3 dict 4 dict 6 dict 7 dict}}
<


Deleted modules/json/tests/support.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

#use fileutil/fileutil.tcl fileutil

catch {unset JSON}
catch {unset TCL}
catch {unset DICTSORT}

proc dictsort3 {spec data} {
    while [llength $spec] {
        set type [lindex $spec 0]
        set spec [lrange $spec 1 end]
        
        switch -- $type {
            dict {
                lappend spec * string
                
                set json {}
                foreach {key} [lsort [dict keys $data]] {
                    set val [dict get $data $key]
                    foreach {keymatch valtype} $spec {
                        if {[string match $keymatch $key]} {
                            lappend json $key [dictsort3 $valtype $val]
                            break
                        }
                    }
                }
                return $json
            }
            list {
                lappend spec * string
                set json {}
                set idx 0
                foreach {val} $data {
                    foreach {keymatch valtype} $spec {
                        if {$idx == $keymatch || $keymatch eq "*"} {
                            lappend json [dictsort3 $valtype $val]
                            break
                        }
                    }
                    incr idx
                }
                return $json
            }
            string {
                return $data
            }
            default {
		error "Invalid type"
	    }
        }
    }
}

foreach f [TestFilesGlob tests/*.json] {
    set name [file rootname [file tail $f]]
    set JSON($name) [tcltest::viewFile $f]
}

foreach f [TestFilesGlob tests/*.result] {
    set name [file rootname [file tail $f]]
    set TCL($name) [tcltest::viewFile $f]
}

foreach f [TestFilesGlob tests/*.sort] {
    set name [file rootname [file tail $f]]
    set DICTSORT($name) [tcltest::viewFile $f]
}

# Postprocessing result of one test case, insert proper expected unicodepoint
set  TCL(menu) [string map [list @@@ \u6021]  $TCL(menu)]

set JSON(emptyList) {[]}
set  TCL(emptyList) {}

set JSON(emptyList2) {{"menu": []}}
set  TCL(emptyList2) {menu {}}

set JSON(emptyList3) {["menu", []]}
set  TCL(emptyList3) {menu {}}

set JSON(emptyList4) {[[]]}
set  TCL(emptyList4) {{}}

set JSON(escapes) {"\t\r\n\f\b\/\\\""}
set  TCL(escapes) "\t\r\n\f\b/\\\""



foreach f [TestFilesGlob tests/*.fail] {
    set name [file rootname [file tail $f]]
    set FAIL($name) [tcltest::viewFile $f]
}

foreach f [TestFilesGlob tests/*.err] {
    set name [file rootname [file tail $f]]
    set ERR($name) [tcltest::viewFile $f]
}

## Tcl has strict escape checking.
## C   uses Tcl_UtfBacklash, and allows lots of irregular escapes.
#
# set FAIL(escape1)        {"\%"}
# set  ERR(escape1-tcl)    {unexpected token "END" at position 0; expecting VALUE}
# set  ERR(escape1-critcl) {syntax error 0 bytes before end, around ``%''}
#
# set FAIL(escape2)        {"\."}
# set  ERR(escape2-tcl)    {unexpected token "END" at position 0; expecting VALUE}
# set  ERR(escape2-critcl) {syntax error 0 bytes before end, around ``.''}



proc resultfor {name} {
    global TCL
    transform $TCL($name) $name
}

proc transform {res name} {
    global DICTSORT
    if {[info exists DICTSORT($name)]} {
        return [dictsort3 $DICTSORT($name) $res]
    } else {
        return $res
    }
}

proc transform* {res args} {
    set t {}
    foreach r $res n $args {
        lappend t [transform $r $n]
    }
    return $t
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































Deleted modules/json/tests/widget.json.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{"widget": {
    "debug": "on",
    "window": {
        "title":"Sample Widget",
        "name": "main_window",
        "width": 500,
        "height": 500},
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": null,
        "hOffset":250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































Deleted modules/json/tests/widget.result.
1
widget {debug on window {title {Sample Widget} name main_window width 500 height 500} text {data {Click Here} size 36 style bold name null hOffset 250 vOffset 100 alignment center onMouseUp {sun1.opacity = (sun1.opacity / 100) * 90;}}}
<


Deleted modules/json/tests/widget.sort.
1
dict * {dict text dict window dict}
<


Changes to modules/math/geometry.tcl.
1258
1259
1260
1261
1262
1263
1264
1265

    namespace export \
	+ - s* direction v h p between distance length \
	nwse rect octant findLineSegmentIntersection \
	findLineIntersection bbox x y conjx conjy
}

package provide math::geometry 1.1.3







|
1258
1259
1260
1261
1262
1263
1264
1265

    namespace export \
	+ - s* direction v h p between distance length \
	nwse rect octant findLineSegmentIntersection \
	findLineIntersection bbox x y conjx conjy
}

package provide math::geometry 1.1.2
Changes to modules/pt/include/format/cparam.inc.
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

[section {C/PARAM code representation of parsing expression grammars}]

[include whatis_cparam_rawc.inc]
[para]

The bulk of such a framework has to be specified through the option
[option -template]. The additional options

[list_begin options]
[opt_def -fun-qualifier string]

[opt_def -main string]
[opt_def -namespace string]
[opt_def -prelude string]
[opt_def -self-command string]
[opt_def -state-decl string]
[opt_def -state-ref string]
[opt_def -string-varname string]
[list_end]

provide code snippets which help to glue framework and generated code
together. Their placeholders are in the [emph generated] code.

Further the options

[list_begin options]
[opt_def -indent integer]
[opt_def -comments boolean]
[list_end]

allow for the customization of the code indent (default none), and
whether to generate comments showing the parsing expressions a
function is for (default on).

[subsection Example]

We are forgoing an example of this representation, with apologies.
It would be way to large for this document.











>












<
<
<
<
<
<
<
<
<
<
<




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24











25
26
27
28

[section {C/PARAM code representation of parsing expression grammars}]

[include whatis_cparam_rawc.inc]
[para]

The bulk of such a framework has to be specified through the option
[option -template]. The additional options

[list_begin options]
[opt_def -fun-qualifier string]
[opt_def -indent integer]
[opt_def -main string]
[opt_def -namespace string]
[opt_def -prelude string]
[opt_def -self-command string]
[opt_def -state-decl string]
[opt_def -state-ref string]
[opt_def -string-varname string]
[list_end]

provide code snippets which help to glue framework and generated code
together. Their placeholders are in the [emph generated] code.












[subsection Example]

We are forgoing an example of this representation, with apologies.
It would be way to large for this document.
Changes to modules/pt/include/format/options_cparam_rawc.inc.
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

[opt_def -indent integer]

The number of characters to indent each line of the generated code by.

The default value is [const 0].


[opt_def -comments boolean]

A flag controlling the generation of code comments containing the
original parsing expression a parsing function is for.

The default value is [const on].

[list_end]







<
<
<
<
<
<
<
<

127
128
129
130
131
132
133








134

[opt_def -indent integer]

The number of characters to indent each line of the generated code by.

The default value is [const 0].









[list_end]
Changes to modules/pt/pkgIndex.tcl.
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# Import plugins, connecting manager to the core conversion packages.
package ifneeded pt::peg::import::json      1 [list source [file join $dir pt_peg_import_json.tcl]]
package ifneeded pt::peg::import::peg       1 [list source [file join $dir pt_peg_import_peg.tcl]]

# Export core functionality: Conversion from PEG to a specific format.
package ifneeded pt::peg::to::container 1 [list source [file join $dir pt_peg_to_container.tcl]]
package ifneeded pt::peg::to::cparam    1.1.1 [list source [file join $dir pt_peg_to_cparam.tcl]]
package ifneeded pt::peg::to::json      1 [list source [file join $dir pt_peg_to_json.tcl]]
package ifneeded pt::peg::to::param     1 [list source [file join $dir pt_peg_to_param.tcl]]
package ifneeded pt::peg::to::peg   1.0.1 [list source [file join $dir pt_peg_to_peg.tcl]]
package ifneeded pt::peg::to::tclparam  1 [list source [file join $dir pt_peg_to_tclparam.tcl]]

# Import core functionality: Conversion from a specific format to PEG.
package ifneeded pt::peg::from::json      1 [list source [file join $dir pt_peg_from_json.tcl]]







|







32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# Import plugins, connecting manager to the core conversion packages.
package ifneeded pt::peg::import::json      1 [list source [file join $dir pt_peg_import_json.tcl]]
package ifneeded pt::peg::import::peg       1 [list source [file join $dir pt_peg_import_peg.tcl]]

# Export core functionality: Conversion from PEG to a specific format.
package ifneeded pt::peg::to::container 1 [list source [file join $dir pt_peg_to_container.tcl]]
package ifneeded pt::peg::to::cparam    1.0.1 [list source [file join $dir pt_peg_to_cparam.tcl]]
package ifneeded pt::peg::to::json      1 [list source [file join $dir pt_peg_to_json.tcl]]
package ifneeded pt::peg::to::param     1 [list source [file join $dir pt_peg_to_param.tcl]]
package ifneeded pt::peg::to::peg   1.0.1 [list source [file join $dir pt_peg_to_peg.tcl]]
package ifneeded pt::peg::to::tclparam  1 [list source [file join $dir pt_peg_to_tclparam.tcl]]

# Import core functionality: Conversion from a specific format to PEG.
package ifneeded pt::peg::from::json      1 [list source [file join $dir pt_peg_from_json.tcl]]
Changes to modules/pt/pt_cparam_config_critcl.tcl.
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
	##

	namespace eval ::@@CHEAD@@ {
	    # # ## ### ##### ######## ############# #####################
	    ## Supporting code for the main command.

	    catch {
		#critcl::cflags -g
		#critcl::debug memory symbols
	    }

	    # # ## ### ###### ######## #############
	    ## RDE runtime, inlined, and made static.

	    # This is the C code for the RDE, i.e. the implementation







|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
	##

	namespace eval ::@@CHEAD@@ {
	    # # ## ### ##### ######## ############# #####################
	    ## Supporting code for the main command.

	    catch {
		#critcl::cheaders -g
		#critcl::debug memory symbols
	    }

	    # # ## ### ###### ######## #############
	    ## RDE runtime, inlined, and made static.

	    # This is the C code for the RDE, i.e. the implementation
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
			    memcpy(lv + 3, av, ac * sizeof (Tcl_Obj*));
			    lv [0] = Tcl_NewObj ();
			    lv [1] = Tcl_NewIntObj (1 + lsv [lsc-1]);
			    lv [2] = Tcl_NewIntObj (rde_param_query_cl (p));

			    Tcl_SetObjResult (interp, Tcl_NewListObj (3, lv));
			    ckfree ((char*) lv);

			} else if (ac == 0) {
			    /*
			     * Match, but no AST. This is possible if the grammar
			     * consists of only the start expression.
			     */
			    Tcl_SetObjResult (interp, Tcl_NewStringObj ("",-1));
			} else {
			    Tcl_SetObjResult (interp, av [0]);
			}

			return TCL_OK;
		    } else {
			Tcl_Obj* xv [1];







<
<
<
<
<
<
<







243
244
245
246
247
248
249







250
251
252
253
254
255
256
			    memcpy(lv + 3, av, ac * sizeof (Tcl_Obj*));
			    lv [0] = Tcl_NewObj ();
			    lv [1] = Tcl_NewIntObj (1 + lsv [lsc-1]);
			    lv [2] = Tcl_NewIntObj (rde_param_query_cl (p));

			    Tcl_SetObjResult (interp, Tcl_NewListObj (3, lv));
			    ckfree ((char*) lv);







			} else {
			    Tcl_SetObjResult (interp, av [0]);
			}

			return TCL_OK;
		    } else {
			Tcl_Obj* xv [1];
Changes to modules/pt/pt_parse_peg_c.tcl.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/pt_peg_to_cparam.man.
1
2
3
4
5
6
7
[comment {--- doctools ---}]
[vset PACKAGE cparam]
[vset NAME    CPARAM]
[vset REQUIRE cparam]
[vset CONFIG  cparam]
[vset VERSION 1.1.1]
[include include/export/to.inc]





|

1
2
3
4
5
6
7
[comment {--- doctools ---}]
[vset PACKAGE cparam]
[vset NAME    CPARAM]
[vset REQUIRE cparam]
[vset CONFIG  cparam]
[vset VERSION 1.0.1]
[include include/export/to.inc]
Changes to modules/pt/pt_peg_to_cparam.tcl.
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
    variable file     unknown        ; # -file
    variable user     unknown        ; # -user
    variable self     {}             ; # -self-command
    variable ns       {}             ; # -namespace
    variable def      static         ; # -fun-qualifier
    variable main     __main         ; # -main
    variable indent   0              ; # -indent
    variable comments 1              ; # -comments
    variable prelude  {}             ; # -prelude
    variable statedecl {RDE_PARAM p} ; # -state-decl
    variable stateref  {p}           ; # -state-ref
    variable strings   p_string      ; # -string-varname
    return
}

proc ::pt::peg::to::cparam::configure {args} {
    variable template
    variable name
    variable file
    variable user
    variable self
    variable ns
    variable def
    variable main
    variable omap
    variable indent
    variable comments
    variable prelude
    variable statedecl
    variable stateref
    variable strings

    if {[llength $args] == 0} {
	return [list \
		    -comments        $comments \
		    -file            $file \
		    -fun-qualifier   $def \
		    -indent          $indent \
		    -main            $main \
		    -name            $name \
		    -namespace       $ns \
		    -self-command    $self \
		    -state-decl      $statedecl \
		    -state-ref       $stateref \
		    -string-varname  $strings \
		    -template        $template \
		    -user            $user \
		   ]
    } elseif {[llength $args] == 1} {
	lassign $args option
	set variable [string range $option 1 end]
	if {[info exists omap($variable)]} {
	    return [set $omap($variable)]
	} else {
	    return -code error "Expected one of -comments, -file, -fun-qualifier, -indent, -main, -name, -namespace, -self-command, -state-decl, -state-ref, -string-varname, -template, or -user, got \"$option\""
	}
    } elseif {[llength $args] % 2 == 0} {
	foreach {option value} $args {
	    set variable [string range $option 1 end]
	    if {![info exists omap($variable)]} {
		return -code error "Expected one of -comments, -file, -fun-qualifier, -indent, -main, -name, -namespace, -self-command, -state-decl, -state-ref, -string-varname, -template, or -user, got \"$option\""
	    }
	}
	foreach {option value} $args {
	    set variable $omap([string range $option 1 end])
	    switch -exact -- $variable {
		template {
		    if {$value eq {}} {
			return -code error "Expected template, got the empty string"
		    }
		}
		indent {
		    if {![string is integer -strict $value] || ($value < 0)} {
			return -code error "Expected int > 0, got \"$value\""
		    }
		}
		comments {
		    if {![string is boolean -strict $value]} {
			return -code error "Expected boolean, got \"$value\""
		    }
		}
		statedecl -
		stateref -
		strings -
		self -
		def -
		ns -
		main -







<


















<







<



















|





|















<
<
<
<
<







46
47
48
49
50
51
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

71
72
73
74
75
76
77

78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118





119
120
121
122
123
124
125
    variable file     unknown        ; # -file
    variable user     unknown        ; # -user
    variable self     {}             ; # -self-command
    variable ns       {}             ; # -namespace
    variable def      static         ; # -fun-qualifier
    variable main     __main         ; # -main
    variable indent   0              ; # -indent

    variable prelude  {}             ; # -prelude
    variable statedecl {RDE_PARAM p} ; # -state-decl
    variable stateref  {p}           ; # -state-ref
    variable strings   p_string      ; # -string-varname
    return
}

proc ::pt::peg::to::cparam::configure {args} {
    variable template
    variable name
    variable file
    variable user
    variable self
    variable ns
    variable def
    variable main
    variable omap
    variable indent

    variable prelude
    variable statedecl
    variable stateref
    variable strings

    if {[llength $args] == 0} {
	return [list \

		    -file            $file \
		    -fun-qualifier   $def \
		    -indent          $indent \
		    -main            $main \
		    -name            $name \
		    -namespace       $ns \
		    -self-command    $self \
		    -state-decl      $statedecl \
		    -state-ref       $stateref \
		    -string-varname  $strings \
		    -template        $template \
		    -user            $user \
		   ]
    } elseif {[llength $args] == 1} {
	lassign $args option
	set variable [string range $option 1 end]
	if {[info exists omap($variable)]} {
	    return [set $omap($variable)]
	} else {
	    return -code error "Expected one of -file, -fun-qualifier, -indent, -main, -name, -namespace, -self-command, -state-decl, -state-ref, -string-varname, -template, or -user, got \"$option\""
	}
    } elseif {[llength $args] % 2 == 0} {
	foreach {option value} $args {
	    set variable [string range $option 1 end]
	    if {![info exists omap($variable)]} {
		return -code error "Expected one of -file, -fun-qualifier, -indent, -main, -name, -namespace, -self-command, -state-decl, -state-ref, -string-varname, -template, or -user, got \"$option\""
	    }
	}
	foreach {option value} $args {
	    set variable $omap([string range $option 1 end])
	    switch -exact -- $variable {
		template {
		    if {$value eq {}} {
			return -code error "Expected template, got the empty string"
		    }
		}
		indent {
		    if {![string is integer -strict $value] || ($value < 0)} {
			return -code error "Expected int > 0, got \"$value\""
		    }
		}





		statedecl -
		stateref -
		strings -
		self -
		def -
		ns -
		main -
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
    if {[text::write exists FUN_HEADER]} {
	text::write recall FUN_HEADER
	text::write undef  FUN_HEADER
    }

    FunStart $name

    # Comment at function start.
    text::write recall PE ; # Generated in Asm::ReExpression, printed
    text::write undef  PE ; # representation of the expression, to
			    # make the generated code more readable.
    uplevel 1 $def
    CStmt return

    FunClose







<







1300
1301
1302
1303
1304
1305
1306

1307
1308
1309
1310
1311
1312
1313
    if {[text::write exists FUN_HEADER]} {
	text::write recall FUN_HEADER
	text::write undef  FUN_HEADER
    }

    FunStart $name


    text::write recall PE ; # Generated in Asm::ReExpression, printed
    text::write undef  PE ; # representation of the expression, to
			    # make the generated code more readable.
    uplevel 1 $def
    CStmt return

    FunClose
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
    text::write field " */"
    text::write /line
    #text::write /line
    return
}

proc ::pt::peg::to::cparam::Op::Asm::PE {pe} {
    variable ::pt::peg::to::cparam::comments

    text::write clear
    if {$comments} {
	text::write field "   /*"
	text::write /line

	# Ticket [da61329276]: Detect C comment opener and closer, and
	# disarm them. This can occur with char classes, and char
	# sequences, i.e. strings. We recode them into
	# backslash-escaped unicode code-points.

	# Note: Putting this into the 'pe print' method is not
	# possible, as the output can be used in other contexts (Tcl,
	# whatever), each with their own special strings to be aware
	# of. This is something each generator has to handle, knowing
	# their special sequences.

	lappend map "*/" "\\u002a\\u002f"
	lappend map "/*" "\\u002f\\u002a"

	foreach l [split [pt::pe print $pe] \n] {
	    text::write field  "    * [string map $map $l]"
	    text::write /line
	}
	text::write field "    */"
	text::write /line
	text::write /line
    }
    # Keeping the definition of PE, albeit empty avoids having to
    # special case the places using this block.
    text::write store PE
    return
}

proc ::pt::peg::to::cparam::Op::Asm::String {s} {
    variable cache








<
<

<
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
|
|
|
<
<
<







1471
1472
1473
1474
1475
1476
1477


1478

1479
1480















1481
1482
1483
1484
1485
1486
1487



1488
1489
1490
1491
1492
1493
1494
    text::write field " */"
    text::write /line
    #text::write /line
    return
}

proc ::pt::peg::to::cparam::Op::Asm::PE {pe} {


    text::write clear

    text::write field "   /*"
    text::write /line















    foreach l [split [pt::pe print $pe] \n] {
	text::write field  "    * $l"
	text::write /line
    }
    text::write field "    */"
    text::write /line
    text::write /line



    text::write store PE
    return
}

proc ::pt::peg::to::cparam::Op::Asm::String {s} {
    variable cache

1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
	variable field 3
	variable  cache
	array set cache {}
	set cache(_str,counter) -1
	set cache(_strings)     {}
    }

    # Map from option name (without leading dash) to the name of the
    # variable used to store setting.
    variable omap ; array set omap {
	comments        comments
	file            file
	fun-qualifier   def
	indent          indent
	main            main
	name            name
	namespace       ns
	prelude         prelude
	self-command    self
	state-decl      statedecl
	state-ref       stateref
	string-varname  strings
	template        template
	user            user
    }

    variable comments  1
    variable self      {}
    variable ns        {}
    variable def       static
    variable main      __main
    variable indent    0
    variable prelude   {}
    variable statedecl {RDE_PARAM p}







<
<

<















<







1525
1526
1527
1528
1529
1530
1531


1532

1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547

1548
1549
1550
1551
1552
1553
1554
	variable field 3
	variable  cache
	array set cache {}
	set cache(_str,counter) -1
	set cache(_strings)     {}
    }



    variable omap ; array set omap {

	file            file
	fun-qualifier   def
	indent          indent
	main            main
	name            name
	namespace       ns
	prelude         prelude
	self-command    self
	state-decl      statedecl
	state-ref       stateref
	string-varname  strings
	template        template
	user            user
    }


    variable self      {}
    variable ns        {}
    variable def       static
    variable main      __main
    variable indent    0
    variable prelude   {}
    variable statedecl {RDE_PARAM p}
1601
1602
1603
1604
1605
1606
1607
1608
1609
				     # which behalf the conversion has
				     # been invoked.
}

# ### ### ### ######### ######### #########
## Ready

package provide pt::peg::to::cparam 1.1.1
return







|

1567
1568
1569
1570
1571
1572
1573
1574
1575
				     # which behalf the conversion has
				     # been invoked.
}

# ### ### ### ######### ######### #########
## Ready

package provide pt::peg::to::cparam 1.0.1
return
Deleted modules/pt/pt_pgen.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# -*- tcl -*-
# pt_pgen.test:  Testing the parser generator, and the generated parsers.
#                Mainly for testing generated parsers for good and bad inputs.
#
# Copyright (c) 2014 by Andreas Kupries <[email protected]>
# All rights reserved.
#
# RCS: @(#) $Id: pt_parse_peg.test,v 1.1 2010/03/26 05:07:24 andreas_kupries Exp $

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.5
testsNeedTcltest 2

support {
    useAccel [useTcllibC] struct/stack.tcl struct::stack ; # User: pt::rde
    TestAccelInit                          struct::stack ; # (tcl)

    use      snit/snit.tcl          snit
    use      fileutil/fileutil.tcl  fileutil      ;# tests/common
    use      textutil/adjust.tcl    textutil::adjust

    useLocal pt_astree.tcl                pt::ast
    useLocal pt_pexpression.tcl           pt::pe
    useLocal pt_pegrammar.tcl             pt::peg
    useLocal pt_peg_container.tcl         pt::peg::container

    useAccel [useTcllibC] pt/pt_rdengine.tcl  pt::rde ; # User: pt::parse::peg
    TestAccelInit                             pt::rde ; # and:  pt:peg::interp

    useLocal pt_rdengine_oo.tcl           pt::rde::oo
    useLocal pt_peg_interp.tcl            pt::peg::interp

    useAccel [useTcllibC] pt/pt_parse_peg.tcl pt::parse::peg ; # User: pt::peg::from::peg
    TestAccelInit                             pt::parse::peg

    useLocal pt_peg_from_json.tcl         pt::peg::from::json                ; # Frontends: json, and PEG text form
    useLocal pt_peg_from_peg.tcl          pt::peg::from::peg                 ; #
    useLocal pt_peg_to_container.tcl      pt::peg::to::container             ; # Backends: json, peg, container code,
    useLocal pt_peg_to_json.tcl           pt::peg::to::json                  ; #           param assembler, 
    useLocal pt_peg_to_peg.tcl            pt::peg::to::peg                   ; #
    useLocal pt_peg_to_param.tcl          pt::peg::to::param                 ; # PARAM assembly, raw
    useLocal pt_peg_to_tclparam.tcl       pt::peg::to::tclparam              ; # PARAM assembly, embedded into Tcl
    useLocal pt_peg_to_cparam.tcl         pt::peg::to::cparam                ; # PARAM assembly, embedded into C
    useLocal pt_tclparam_config_snit.tcl  pt::tclparam::configuration::snit  ; # PARAM/Tcl, snit::type
    useLocal pt_tclparam_config_tcloo.tcl pt::tclparam::configuration::tcloo ; # PARAM/Tcl, TclOO class
    useLocal pt_cparam_config_critcl.tcl  pt::cparam::configuration::critcl  ; # PARAM/C, in critcl

    # Get the parser used by the converter, either the grammar
    # interpreter, or snit-based and spcialized to PEG.
    #useLocal pt_peg_container_peg.tcl  pt::peg::container::peg
    #useLocal pt_peg_interp.tcl         pt::peg::interp

    source [localPath tests/common]
}
testing {
    useLocal pt_pgen.tcl pt::pgen ;# Generator
}

set mytestdir tests/data

# -------------------------------------------------------------------------
# Note: When using pt::rde's C implementation struct::stack is not
#       used, and its implementation of no relevance.
#
#       Similarly, when pt::parse::peg's C implementation is used
#       neither pt::rde's, nor struct::stack's implementations are of
#       relevance.

TestAccelDo pt::parse::peg parseimpl {
    if {$parseimpl eq "critcl"} {
	set rdeimpl   n/a
	set stackimpl n/a
	pt::rde::SwitchTo {}
	struct::stack::SwitchTo {}
	source [localPath tests/pt_pgen.tests]
    } else {
	TestAccelDo pt::rde rdeimpl {
	    if {$rdeimpl eq "critcl"} {
		set stackimpl n/a
		struct::stack::SwitchTo {}
		source [localPath tests/pt_pgen.tests]
	    } else {
		TestAccelDo struct::stack stackimpl {
		    source [localPath tests/pt_pgen.tests]
		}
	    }
	}
    }
}

# -------------------------------------------------------------------------
TestAccelExit pt::parse::peg
TestAccelExit pt::rde
TestAccelExit struct::stack
testsuiteCleanup
return
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































Changes to modules/pt/pt_rdengine_c.tcl.
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# # ## ### ##### ######## ############# #####################
## Requisites

package require Tcl 8.4
package require critcl
# @sak notprovided pt_rde_critcl
package provide pt_rde_critcl 1.3.2

# # ## ### ##### ######## ############# #####################
## Implementation

namespace eval ::pt {

    # # ## ### ##### ######## ############# #####################







|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# # ## ### ##### ######## ############# #####################
## Requisites

package require Tcl 8.4
package require critcl
# @sak notprovided pt_rde_critcl
package provide pt_rde_critcl 1.3.1

# # ## ### ##### ######## ############# #####################
## Implementation

namespace eval ::pt {

    # # ## ### ##### ######## ############# #####################
Changes to modules/pt/pt_rdengine_oo.tcl.
1
2
3
4
5
6
7
8
9
10
# -*- tcl -*-
#
# Copyright (c) 2009-2014 by Andreas Kupries <[email protected]>

# # ## ### ##### ######## ############# #####################
## Package description

## Implementation of the PackRat Machine (PARAM), a virtual machine on
## top of which parsers for Parsing Expression Grammars (PEGs) can be
## realized. This implementation is tied to Tcl for control flow. We


|







1
2
3
4
5
6
7
8
9
10
# -*- tcl -*-
#
# Copyright (c) 2009 by Andreas Kupries <[email protected]>

# # ## ### ##### ######## ############# #####################
## Package description

## Implementation of the PackRat Machine (PARAM), a virtual machine on
## top of which parsers for Parsing Expression Grammars (PEGs) can be
## realized. This implementation is tied to Tcl for control flow. We
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
	if {$myok} {
	    set n [$mystackast size]
	    if {$n > 1} {
		set  pos [$mystackloc peek]
		incr pos
		set children [lreverse [$mystackast peek [$mystackast size]]]     ; # SaveToMark
		return [pt::ast new {} $pos $myloc {*}$children] ; # Reduce ALL
	    } elseif {$n == 0} {
		# Match, but no AST. This is possible if the grammar
		# consists of only the start expression.
		return {}
	    } else {
		return [$mystackast peek]
	    }
	} else {
	    lassign $myerror loc messages
	    return -code error [list pt::rde $loc $messages]
	}
    }

    # # ## ### ##### ######## ############# #####################
    ## API - State accessors

    method chan   {} { return $mychan }







<
<
<
<





|







68
69
70
71
72
73
74




75
76
77
78
79
80
81
82
83
84
85
86
87
	if {$myok} {
	    set n [$mystackast size]
	    if {$n > 1} {
		set  pos [$mystackloc peek]
		incr pos
		set children [lreverse [$mystackast peek [$mystackast size]]]     ; # SaveToMark
		return [pt::ast new {} $pos $myloc {*}$children] ; # Reduce ALL




	    } else {
		return [$mystackast peek]
	    }
	} else {
	    lassign $myerror loc messages
	    return -code error [list pt::rde $loc [$self position $loc] $messages]
	}
    }

    # # ## ### ##### ######## ############# #####################
    ## API - State accessors

    method chan   {} { return $mychan }
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
	}

	if {$myok} {
	    $mystackloc pop
	    return -code return
	}
	set myloc [$mystackloc peek]
	$mystackerr push $myerror
	return
    }

    method si:voidvalue_branch {} {
	# i_error_pop_merge
	# i:ok_loc_pop_discard
	# i:ok_return







|







355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
	}

	if {$myok} {
	    $mystackloc pop
	    return -code return
	}
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    method si:voidvalue_branch {} {
	# i_error_pop_merge
	# i:ok_loc_pop_discard
	# i:ok_return
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130

1131
1132
1133
1134
1135
1136
1137
		set mysvalue [pt::ast new $symbol $pos $myloc {*}$mysvalue] ; # Reduce $symbol
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:reduce_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }







<
|






<
>







1111
1112
1113
1114
1115
1116
1117

1118
1119
1120
1121
1122
1123
1124

1125
1126
1127
1128
1129
1130
1131
1132
		set mysvalue [pt::ast new $symbol $pos $myloc {*}$mysvalue] ; # Reduce $symbol
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174

1175
1176
1177
1178
1179
1180
1181
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:void_leaf_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }








<
|






<
>







1154
1155
1156
1157
1158
1159
1160

1161
1162
1163
1164
1165
1166
1167

1168
1169
1170
1171
1172
1173
1174
1175
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218

1219
1220
1221
1222
1223
1224
1225
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:value_leaf_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }







<
|






<
>







1197
1198
1199
1200
1201
1202
1203

1204
1205
1206
1207
1208
1209
1210

1211
1212
1213
1214
1215
1216
1217
1218
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248

1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274

1275
1276
1277
1278
1279
1280
1281

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:value_clear_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	$mystackast trim* [$mystackmark pop]
	return
    }

    method si:void_clear_symbol_end {symbol} {
	# i_value_clear
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:void_clear_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}

	return
    }

    # # ## ### ##### ######## ############# #####################
    ## API - Instructions - Control flow

    method i:ok_continue {} {







<
|






<
>

















<
|






<
>







1226
1227
1228
1229
1230
1231
1232

1233
1234
1235
1236
1237
1238
1239

1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257

1258
1259
1260
1261
1262
1263
1264

1265
1266
1267
1268
1269
1270
1271
1272

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	$mystackast trim* [$mystackmark pop]
	return
    }

    method si:void_clear_symbol_end {symbol} {
	# i_value_clear
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}
	return
    }

    # # ## ### ##### ######## ############# #####################
    ## API - Instructions - Control flow

    method i:ok_continue {} {
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
	# Equal locations, merge the message lists.
	#set myerror [list $loe [struct::set union $msgse $msgsn]]
	set myerror [list $loe [lsort -uniq [list {*}$msgse {*}$msgsn]]]
	return
    }

    method i_error_nonterminal {symbol} {
	#  i_error_nonterminal -- Disabled. Generate only low-level
	#  i_error_nonterminal -- errors until we have worked out how
	#  i_error_nonterminal -- to integrate symbol information with
	#  i_error_nonterminal -- them. Do not forget where this
	#  i_error_nonterminal -- instruction is inlined.
	return

	# Inlined: Errors, Expected.
	if {![llength $myerror]} return
	set pos [$mystackloc peek]
	incr pos
	lassign $myerror loc messages
	if {$loc != $pos} return
	set myerror [list $loc [list $symbol]]







<
<
<
<
<
<
<







1346
1347
1348
1349
1350
1351
1352







1353
1354
1355
1356
1357
1358
1359
	# Equal locations, merge the message lists.
	#set myerror [list $loe [struct::set union $msgse $msgsn]]
	set myerror [list $loe [lsort -uniq [list {*}$msgse {*}$msgsn]]]
	return
    }

    method i_error_nonterminal {symbol} {







	# Inlined: Errors, Expected.
	if {![llength $myerror]} return
	set pos [$mystackloc peek]
	incr pos
	lassign $myerror loc messages
	if {$loc != $pos} return
	set myerror [list $loc [list $symbol]]
Changes to modules/pt/pt_rdengine_tcl.tcl.
1
2
3
4
5
6
7
8
9
10
# -*- tcl -*-
#
# Copyright (c) 2009-2014 by Andreas Kupries <[email protected]>

# # ## ### ##### ######## ############# #####################
## Package description

## Implementation of the PackRat Machine (PARAM), a virtual machine on
## top of which parsers for Parsing Expression Grammars (PEGs) can be
## realized. This implementation is tied to Tcl for control flow. We


|







1
2
3
4
5
6
7
8
9
10
# -*- tcl -*-
#
# Copyright (c) 2009 by Andreas Kupries <[email protected]>

# # ## ### ##### ######## ############# #####################
## Package description

## Implementation of the PackRat Machine (PARAM), a virtual machine on
## top of which parsers for Parsing Expression Grammars (PEGs) can be
## realized. This implementation is tied to Tcl for control flow. We
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
	set mystackerr  [struct::stack ${selfns}::ERR]  ; # ES
	set mystackast  [struct::stack ${selfns}::AST]  ; # ARS/AS
	set mystackmark [struct::stack ${selfns}::MARK] ; # s.a.
	return
    }

    #TRACE variable count 0
    #variable count 0

    method reset {{chan {}}} { ; #set count 0
                               ; #TRACE puts "[format %8d [incr count]] RDE reset"
	set mychan    $chan      ; # IN
	set mycurrent {}         ; # CC
	set myloc     -1         ; # CL
	set myok      0          ; # ST
	set msvalue   {}         ; # SV
	set myerror   {}         ; # ER
	set mytoken   {}         ; # TC







<

<
|







35
36
37
38
39
40
41

42

43
44
45
46
47
48
49
50
	set mystackerr  [struct::stack ${selfns}::ERR]  ; # ES
	set mystackast  [struct::stack ${selfns}::AST]  ; # ARS/AS
	set mystackmark [struct::stack ${selfns}::MARK] ; # s.a.
	return
    }

    #TRACE variable count 0



    method reset {{chan {}}} { ; #TRACE puts "[format %8d [incr count]] RDE reset"
	set mychan    $chan      ; # IN
	set mycurrent {}         ; # CC
	set myloc     -1         ; # CL
	set myok      0          ; # ST
	set msvalue   {}         ; # SV
	set myerror   {}         ; # ER
	set mytoken   {}         ; # TC
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
	if {$myok} {
	    set n [$mystackast size]
	    if {$n > 1} {
		set  pos [$mystackloc peek]
		incr pos
		set children [$mystackast peekr [$mystackast size]] ; # SaveToMark
		return [pt::ast new {} $pos $myloc {*}$children]    ; # Reduce ALL
	    } elseif {$n == 0} {
		# Match, but no AST. This is possible if the grammar
		# consists of only the start expression.
		return {}
	    } else {
		return [$mystackast peek]
	    }
	} else {
	    lassign $myerror loc messages
	    return -code error [list pt::rde $loc $messages]
	}







<
<
<
<







61
62
63
64
65
66
67




68
69
70
71
72
73
74
	if {$myok} {
	    set n [$mystackast size]
	    if {$n > 1} {
		set  pos [$mystackloc peek]
		incr pos
		set children [$mystackast peekr [$mystackast size]] ; # SaveToMark
		return [pt::ast new {} $pos $myloc {*}$children]    ; # Reduce ALL




	    } else {
		return [$mystackast peek]
	    }
	} else {
	    lassign $myerror loc messages
	    return -code error [list pt::rde $loc $messages]
	}
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
	append mytoken $data
	return
    }

    # # ## ### ##### ######## ############# #####################
    ## Common instruction sequences

    method si:void_state_push {} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_state_push"
	# i_loc_push
	# i_error_clear_push
	$mystackloc push $myloc
	set myerror {}
	$mystackerr push {}
	return
    }

    method si:void2_state_push {} { ; #TRACE puts "[format %8d [incr count]] RDE si:void2_state_push"
	# i_loc_push
	# i_error_push
	$mystackloc push $myloc
	$mystackerr push {}
	return
    }

    method si:value_state_push {} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_state_push"
	# i_ast_push
	# i_loc_push
	# i_error_clear_push
	$mystackmark push [$mystackast size]
	$mystackloc push $myloc
	set myerror {}
	$mystackerr push {}
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:void_state_merge {} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_state_merge"
	# i_error_pop_merge
	# i_loc_pop_rewind/discard

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
	if {![llength $myerror]}  {
	    set myerror $olderror







|








|







|












|







123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
	append mytoken $data
	return
    }

    # # ## ### ##### ######## ############# #####################
    ## Common instruction sequences

    method si:void_state_push {} {
	# i_loc_push
	# i_error_clear_push
	$mystackloc push $myloc
	set myerror {}
	$mystackerr push {}
	return
    }

    method si:void2_state_push {} {
	# i_loc_push
	# i_error_push
	$mystackloc push $myloc
	$mystackerr push {}
	return
    }

    method si:value_state_push {} {
	# i_ast_push
	# i_loc_push
	# i_error_clear_push
	$mystackmark push [$mystackast size]
	$mystackloc push $myloc
	set myerror {}
	$mystackerr push {}
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:void_state_merge {} {
	# i_error_pop_merge
	# i_loc_pop_rewind/discard

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
	if {![llength $myerror]}  {
	    set myerror $olderror
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

	set last [$mystackloc pop]
	if {$myok} return
	set myloc $last
	return
    }

    method si:void_state_merge_ok {} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_state_merge_ok"
	# i_error_pop_merge
	# i_loc_pop_rewind/discard
	# i_status_ok

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
	if {![llength $myerror]}  {







|







182
183
184
185
186
187
188
189
190
191
192
193
194
195
196

	set last [$mystackloc pop]
	if {$myok} return
	set myloc $last
	return
    }

    method si:void_state_merge_ok {} {
	# i_error_pop_merge
	# i_loc_pop_rewind/discard
	# i_status_ok

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
	if {![llength $myerror]}  {
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
	set last [$mystackloc pop]
	if {$myok} return
	set myloc $last
	set myok 1
	return
    }

    method si:value_state_merge {} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_state_merge"
	# i_error_pop_merge
	# i_ast_pop_rewind/discard
	# i_loc_pop_rewind/discard

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
	if {![llength $myerror]}  {







|







213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
	set last [$mystackloc pop]
	if {$myok} return
	set myloc $last
	set myok 1
	return
    }

    method si:value_state_merge {} {
	# i_error_pop_merge
	# i_ast_pop_rewind/discard
	# i_loc_pop_rewind/discard

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
	if {![llength $myerror]}  {
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
	$mystackast trim* $mark
	set myloc $last
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:value_notahead_start {} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_notahead_start"
	# i_loc_push
	# i_ast_push

	$mystackloc  push $myloc
	$mystackmark push [$mystackast size]
	return
    }

    method si:void_notahead_exit {} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_notahead_exit"
	# i_loc_pop_rewind
	# i_status_negate

	set myloc [$mystackloc pop]
	set myok [expr {!$myok}]
	return
    }

    method si:value_notahead_exit {} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_notahead_exit"
	# i_ast_pop_discard/rewind
	# i_loc_pop_rewind
	# i_status_negate

	set mark [$mystackmark pop]
	if {$myok} {
	    $mystackast trim* $mark
	}
	set myloc [$mystackloc pop]
	set myok [expr {!$myok}]
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:kleene_abort {} { ; #TRACE puts "[format %8d [incr count]] RDE si:kleene_abort"
	# i_loc_pop_rewind/discard
	# i:fail_return

	set last [$mystackloc pop]
	if {$myok} return
	set myloc $last
	return -code return
    }

    method si:kleene_close {} { ; #TRACE puts "[format %8d [incr count]] RDE si:kleene_close"
	# i_error_pop_merge
	# i_loc_pop_rewind/discard
	# i:fail_status_ok
	# i:fail_return

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.







|








|








|















|









|







247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
	$mystackast trim* $mark
	set myloc $last
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:value_notahead_start {} {
	# i_loc_push
	# i_ast_push

	$mystackloc  push $myloc
	$mystackmark push [$mystackast size]
	return
    }

    method si:void_notahead_exit {} {
	# i_loc_pop_rewind
	# i_status_negate

	set myloc [$mystackloc pop]
	set myok [expr {!$myok}]
	return
    }

    method si:value_notahead_exit {} {
	# i_ast_pop_discard/rewind
	# i_loc_pop_rewind
	# i_status_negate

	set mark [$mystackmark pop]
	if {$myok} {
	    $mystackast trim* $mark
	}
	set myloc [$mystackloc pop]
	set myok [expr {!$myok}]
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:kleene_abort {} {
	# i_loc_pop_rewind/discard
	# i:fail_return

	set last [$mystackloc pop]
	if {$myok} return
	set myloc $last
	return -code return
    }

    method si:kleene_close {} {
	# i_error_pop_merge
	# i_loc_pop_rewind/discard
	# i:fail_status_ok
	# i:fail_return

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
	set myok 1
	set myloc $last
	return -code return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:voidvoid_branch {} { ; #TRACE puts "[format %8d [incr count]] RDE si:voidvoid_branch"
	# i_error_pop_merge
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_loc_rewind
	# i_error_push

	set olderror [$mystackerr pop]







|







325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
	set myok 1
	set myloc $last
	return -code return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:voidvoid_branch {} {
	# i_error_pop_merge
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_loc_rewind
	# i_error_push

	set olderror [$mystackerr pop]
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
	}

	if {$myok} {
	    $mystackloc pop
	    return -code return
	}
	set myloc [$mystackloc peek]
	$mystackerr push $myerror
	return
    }

    method si:voidvalue_branch {} { ; #TRACE puts "[format %8d [incr count]] RDE si:voidvalue_branch"
	# i_error_pop_merge
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_ast_push
	# i_loc_rewind
	# i_error_push








|



|







356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
	}

	if {$myok} {
	    $mystackloc pop
	    return -code return
	}
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    method si:voidvalue_branch {} {
	# i_error_pop_merge
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_ast_push
	# i_loc_rewind
	# i_error_push

403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
	}
	$mystackmark push [$mystackast size]
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    method si:valuevoid_branch {} { ; #TRACE puts "[format %8d [incr count]] RDE si:valuevoid_branch"
	# i_error_pop_merge
	# i_ast_pop_rewind/discard
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_loc_rewind
	# i_error_push








|







397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
	}
	$mystackmark push [$mystackast size]
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    method si:valuevoid_branch {} {
	# i_error_pop_merge
	# i_ast_pop_rewind/discard
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_loc_rewind
	# i_error_push

440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
	}
	$mystackast trim* $mark
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    method si:valuevalue_branch {} { ; #TRACE puts "[format %8d [incr count]] RDE si:valuevalue_branch"
	# i_error_pop_merge
	# i_ast_pop_discard
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_ast_rewind
	# i_loc_rewind
	# i_error_push







|







434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
	}
	$mystackast trim* $mark
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    method si:valuevalue_branch {} {
	# i_error_pop_merge
	# i_ast_pop_discard
	# i:ok_loc_pop_discard
	# i:ok_return
	# i_ast_rewind
	# i_loc_rewind
	# i_error_push
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:voidvoid_part {} { ; #TRACE puts "[format %8d [incr count]] RDE si:voidvoid_part"
	# i_error_pop_merge
	# i:fail_loc_pop_rewind
	# i:fail_return
	# i_error_push

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.







|







474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
	set myloc [$mystackloc peek]
	$mystackerr push {}
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:voidvoid_part {} {
	# i_error_pop_merge
	# i:fail_loc_pop_rewind
	# i:fail_return
	# i_error_push

	set olderror [$mystackerr pop]
	# We have either old or new error data, keep it.
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
	    set myloc [$mystackloc pop]
	    return -code return
	}
	$mystackerr push $myerror
	return
    }

    method si:voidvalue_part {} { ; #TRACE puts "[format %8d [incr count]] RDE si:voidvalue_part"
	# i_error_pop_merge
	# i:fail_loc_pop_rewind
	# i:fail_return
	# i_ast_push
	# i_error_push

	set olderror [$mystackerr pop]







|







506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
	    set myloc [$mystackloc pop]
	    return -code return
	}
	$mystackerr push $myerror
	return
    }

    method si:voidvalue_part {} {
	# i_error_pop_merge
	# i:fail_loc_pop_rewind
	# i:fail_return
	# i_ast_push
	# i_error_push

	set olderror [$mystackerr pop]
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
	    return -code return
	}
	$mystackmark push [$mystackast size]
	$mystackerr push $myerror
	return
    }

    method si:valuevalue_part {} { ; #TRACE puts "[format %8d [incr count]] RDE si:valuevalue_part"
	# i_error_pop_merge
	# i:fail_ast_pop_rewind
	# i:fail_loc_pop_rewind
	# i:fail_return
	# i_error_push

	set olderror [$mystackerr pop]







|







540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
	    return -code return
	}
	$mystackmark push [$mystackast size]
	$mystackerr push $myerror
	return
    }

    method si:valuevalue_part {} {
	# i_error_pop_merge
	# i:fail_ast_pop_rewind
	# i:fail_loc_pop_rewind
	# i:fail_return
	# i_error_push

	set olderror [$mystackerr pop]
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
	}
	$mystackerr push $myerror
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:next_str {tok} { ; #TRACE puts "[format %8d [incr count]] RDE si:next_str ($tok)"
	# String = sequence of characters. No need for all the intermediate
	# stack churn.

	set n    [string length $tok]
	set last [expr {$myloc + $n}]
	set max  [string length $mytoken]

	incr myloc
	if {($last >= $max) && ![ExtendTCN [expr {$last - $max + 1}]]} {
	    set myok    0
	    set myerror [list $myloc [list [list t $tok]]]
	    # i:fail_return
	    return
	}
	set lex       [string range $mytoken $myloc $last]
	set mycurrent [string index $mytoken $last]

	# ATTENTION: The error output of this instruction is different
	# from a regular sequence of si:next_char instructions. The
	# error location will be the start of the string token we
	# wanted to match, and the message will contain the entire
	# string token. In the regular sequence we would see the exact
	# point of the mismatch instead, with the message containing
	# the expected character.

	set myok [expr {$tok eq $lex}]

	if {$myok} {
	    set myloc $last
	    set myerror {}
	} else {
	    set myerror [list $myloc [list [list t $tok]]]
	    incr myloc -1
	}
	return
    }

    method si:next_class {tok} { ; #TRACE puts "[format %8d [incr count]] RDE si:next_class ($tok)"
	# Class = Choice of characters. No need for stack churn.

	# i_input_next "\{t $c\}"
	# i:fail_return
	# i_test_<user class>

	incr myloc







|

















<
<
<
<
<
<
<
<












|







576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600








601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
	}
	$mystackerr push $myerror
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:next_str {tok} {
	# String = sequence of characters. No need for all the intermediate
	# stack churn.

	set n    [string length $tok]
	set last [expr {$myloc + $n}]
	set max  [string length $mytoken]

	incr myloc
	if {($last >= $max) && ![ExtendTCN [expr {$last - $max + 1}]]} {
	    set myok    0
	    set myerror [list $myloc [list [list t $tok]]]
	    # i:fail_return
	    return
	}
	set lex       [string range $mytoken $myloc $last]
	set mycurrent [string index $mytoken $last]









	set myok [expr {$tok eq $lex}]

	if {$myok} {
	    set myloc $last
	    set myerror {}
	} else {
	    set myerror [list $myloc [list [list t $tok]]]
	    incr myloc -1
	}
	return
    }

    method si:next_class {tok} {
	# Class = Choice of characters. No need for stack churn.

	# i_input_next "\{t $c\}"
	# i:fail_return
	# i_test_<user class>

	incr myloc
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
	} else {
	    set myerror [list $myloc [list [list t $tok]]]
	    incr myloc -1
	}
	return
    }

    method si:next_char {tok} { ; #TRACE puts "[format %8d [incr count]] RDE si:next_char ($tok)"
	# i_input_next "\{t $c\}"
	# i:fail_return
	# i_test_char $c

	incr myloc
	if {($myloc >= [string length $mytoken]) && ![ExtendTC]} {
	    set myok    0







|







636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
	} else {
	    set myerror [list $myloc [list [list t $tok]]]
	    incr myloc -1
	}
	return
    }

    method si:next_char {tok} {
	# i_input_next "\{t $c\}"
	# i:fail_return
	# i_test_char $c

	incr myloc
	if {($myloc >= [string length $mytoken]) && ![ExtendTC]} {
	    set myok    0
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
	} else {
	    set myerror [list $myloc [list [list t $tok]]]
	    incr myloc -1
	}
	return
    }

    method si:next_range {toks toke} { ; #TRACE puts "[format %8d [incr count]] RDE si:next_range ($toks $toke)"
	#Asm::Ins i_input_next "\{.. $s $e\}"
	#Asm::Ins i:fail_return
	#Asm::Ins i_test_range $s $e

	incr myloc
	if {($myloc >= [string length $mytoken]) && ![ExtendTC]} {
	    set myok    0







|







660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
	} else {
	    set myerror [list $myloc [list [list t $tok]]]
	    incr myloc -1
	}
	return
    }

    method si:next_range {toks toke} {
	#Asm::Ins i_input_next "\{.. $s $e\}"
	#Asm::Ins i:fail_return
	#Asm::Ins i_test_range $s $e

	incr myloc
	if {($myloc >= [string length $mytoken]) && ![ExtendTC]} {
	    set myok    0
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
	    set myerror {}
	}
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:value_symbol_start {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_symbol_start ($symbol)"
	# if @runtime@ i_symbol_restore $symbol
	# i:found:ok_ast_value_push
	# i:found_return
	# i_loc_push
	# i_ast_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    if {$myok} {
		$mystackast push $mysvalue
	    }
	    return -code return
	}
	$mystackloc  push $myloc
	$mystackmark push [$mystackast size]
	return
    }

    method si:value_void_symbol_start {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_void_symbol_start ($symbol)"
	# if @runtime@ i_symbol_restore $symbol
	# i:found_return
	# i_loc_push
	# i_ast_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    return -code return
	}
	$mystackloc  push $myloc
	$mystackmark push [$mystackast size]
	return
    }

    method si:void_symbol_start {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_symbol_start ($symbol)"
	# if @runtime@ i_symbol_restore $symbol
	# i:found:ok_ast_value_push
	# i:found_return
	# i_loc_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    if {$myok} {
		$mystackast push $mysvalue
	    }
	    return -code return
	}
	$mystackloc push $myloc
	return
    }

    method si:void_void_symbol_start {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_void_symbol_start ($symbol)"
	# if @runtime@ i_symbol_restore $symbol
	# i:found_return
	# i_loc_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    return -code return
	}
	$mystackloc push $myloc
	return
    }

    method si:reduce_symbol_end {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:reduce_symbol_end ($symbol)"
	# i_value_clear/reduce $symbol
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_ast_pop_rewind
	# i_loc_pop_discard
	# i:ok_ast_value_push








|



















|















|

















|













|







1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
	    set myerror {}
	}
	return
    }

    # - -- --- ----- -------- ------------- ---------------------

    method si:value_symbol_start {symbol} {
	# if @runtime@ i_symbol_restore $symbol
	# i:found:ok_ast_value_push
	# i:found_return
	# i_loc_push
	# i_ast_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    if {$myok} {
		$mystackast push $mysvalue
	    }
	    return -code return
	}
	$mystackloc  push $myloc
	$mystackmark push [$mystackast size]
	return
    }

    method si:value_void_symbol_start {symbol} {
	# if @runtime@ i_symbol_restore $symbol
	# i:found_return
	# i_loc_push
	# i_ast_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    return -code return
	}
	$mystackloc  push $myloc
	$mystackmark push [$mystackast size]
	return
    }

    method si:void_symbol_start {symbol} {
	# if @runtime@ i_symbol_restore $symbol
	# i:found:ok_ast_value_push
	# i:found_return
	# i_loc_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    if {$myok} {
		$mystackast push $mysvalue
	    }
	    return -code return
	}
	$mystackloc push $myloc
	return
    }

    method si:void_void_symbol_start {symbol} {
	# if @runtime@ i_symbol_restore $symbol
	# i:found_return
	# i_loc_push

	set k [list $myloc $symbol]
	if {[info exists mysymbol($k)]} { 
	    lassign $mysymbol($k) myloc myok myerror mysvalue
	    return -code return
	}
	$mystackloc push $myloc
	return
    }

    method si:reduce_symbol_end {symbol} {
	# i_value_clear/reduce $symbol
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_ast_pop_rewind
	# i_loc_pop_discard
	# i:ok_ast_value_push

1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141

1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
		set mysvalue [pt::ast new $symbol $pos $myloc {*}$mysvalue] ; # Reduce $symbol
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:reduce_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

    method si:void_leaf_symbol_end {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_leaf_symbol_end ($symbol)"
	# i_value_clear/leaf $symbol
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard
	# i:ok_ast_value_push

	set mysvalue {}







<
|






<
>








|







1112
1113
1114
1115
1116
1117
1118

1119
1120
1121
1122
1123
1124
1125

1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
		set mysvalue [pt::ast new $symbol $pos $myloc {*}$mysvalue] ; # Reduce $symbol
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

    method si:void_leaf_symbol_end {symbol} {
	# i_value_clear/leaf $symbol
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard
	# i:ok_ast_value_push

	set mysvalue {}
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185

1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:void_leaf_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

    method si:value_leaf_symbol_end {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_leaf_symbol_end ($symbol)"
	# i_value_clear/leaf $symbol
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard
	# i_ast_pop_rewind
	# i:ok_ast_value_push








<
|






<
>







|







1155
1156
1157
1158
1159
1160
1161

1162
1163
1164
1165
1166
1167
1168

1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

    method si:value_leaf_symbol_end {symbol} {
	# i_value_clear/leaf $symbol
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard
	# i_ast_pop_rewind
	# i:ok_ast_value_push

1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229

1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259

1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285

1286
1287
1288
1289
1290
1291
1292
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:value_leaf_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

    method si:value_clear_symbol_end {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:value_clear_symbol_end ($symbol)"
	# i_value_clear
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard
	# i_ast_pop_rewind

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:value_clear_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}


	$mystackast trim* [$mystackmark pop]
	return
    }

    method si:void_clear_symbol_end {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE si:void_clear_symbol_end ($symbol)"
	# i_value_clear
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]

	# si:void_clear_symbol_end / i_error_nonterminal -- inlined -- disabled
	if {0} {if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }
	}}

	return
    }

    # # ## ### ##### ######## ############# #####################
    ## API - Instructions - Control flow

    method i:ok_continue {} { ; #TRACE puts "[format %8d [incr count]] RDE i:ok_continue"







<
|






<
>








|












<
|






<
>





|











<
|






<
>







1198
1199
1200
1201
1202
1203
1204

1205
1206
1207
1208
1209
1210
1211

1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233

1234
1235
1236
1237
1238
1239
1240

1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258

1259
1260
1261
1262
1263
1264
1265

1266
1267
1268
1269
1270
1271
1272
1273
		set mysvalue [pt::ast new $symbol $pos $myloc]
	    }
	}

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	$mystackast trim* [$mystackmark pop]
	if {$myok} {
	    $mystackast push $mysvalue
	}
	return
    }

    method si:value_clear_symbol_end {symbol} {
	# i_value_clear
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard
	# i_ast_pop_rewind

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}

	$mystackast trim* [$mystackmark pop]
	return
    }

    method si:void_clear_symbol_end {symbol} {
	# i_value_clear
	# i_symbol_save       $symbol
	# i_error_nonterminal $symbol
	# i_loc_pop_discard

	set mysvalue {}
	set at [$mystackloc pop]

	set k  [list $at $symbol]
	set mysymbol($k) [list $myloc $myok $myerror $mysvalue]


	if {[llength $myerror]} {
	    set  pos $at
	    incr pos
	    lassign $myerror loc messages
	    if {$loc == $pos} {
		set myerror [list $loc [list [list n $symbol]]]
	    }

	}
	return
    }

    # # ## ### ##### ######## ############# #####################
    ## API - Instructions - Control flow

    method i:ok_continue {} { ; #TRACE puts "[format %8d [incr count]] RDE i:ok_continue"
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
    ##  API - Instructions - Error handling.

    method i_error_clear {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_clear"
	set myerror {}
	return
    }

    method i_error_push {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_push ($myerror)"
	$mystackerr push $myerror
	return
    }

    method i_error_clear_push {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_clear_push ()"
	set myerror {}
	$mystackerr push {}
	return
    }

    method i_error_pop_merge {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_pop_merge ($myerror)-/-([$mystackerr peek])"
	set olderror [$mystackerr pop]

	# We have either old or new error data, keep it.

	if {![llength $myerror]}  { set myerror $olderror ; return }
	if {![llength $olderror]} return








|




|





|







1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
    ##  API - Instructions - Error handling.

    method i_error_clear {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_clear"
	set myerror {}
	return
    }

    method i_error_push {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_push"
	$mystackerr push $myerror
	return
    }

    method i_error_clear_push {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_clear_push"
	set myerror {}
	$mystackerr push {}
	return
    }

    method i_error_pop_merge {} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_pop_merge"
	set olderror [$mystackerr pop]

	# We have either old or new error data, keep it.

	if {![llength $myerror]}  { set myerror $olderror ; return }
	if {![llength $olderror]} return

1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
	if {$loe > $lon} return

	# Equal locations, merge the message lists, set-like.
	set myerror [list $loe [lsort -uniq [list {*}$msgse {*}$msgsn]]]
	return
    }

    method i_error_nonterminal {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_nonterminal ($symbol)"
	#  i_error_nonterminal -- Disabled. Generate only low-level
	#  i_error_nonterminal -- errors until we have worked out how
	#  i_error_nonterminal -- to integrate symbol information with
	#  i_error_nonterminal -- them. Do not forget where this
	#  i_error_nonterminal -- instruction is inlined.
	return

	# Inlined: Errors, Expected.
	if {![llength $myerror]} {
	    #TRACE puts "[format %8d $count] RDE i_error_nonterminal ($symbol) no error"
	    return
	}
	set pos [$mystackloc peek]
	incr pos
	lassign $myerror loc messages
	if {$loc != $pos} {
	    #TRACE puts "[format %8d $count] RDE i_error_nonterminal ($symbol) -- $myerror != $pos"
	    return
	}
	set myerror [list $loc [list [list n $symbol]]]
	TRACE puts "[format %8d $count] RDE i_error_nonterminal ($symbol) := $myerror"
	return
    }

    # # ## ### ##### ######## ############# #####################
    ##  API - Instructions - Basic input handling and tracking

    method i_loc_pop_rewind/discard {} { ; #TRACE puts "[format %8d [incr count]] RDE i_loc_pop_rewind/discard (ok $myok ([expr {$myok ? "keep $myloc drop" : "back@"}] [$mystackloc peek]))"







|
<
<
<
<
<
<
<

|
<
<
<



|
<
<
<

<







1345
1346
1347
1348
1349
1350
1351
1352







1353
1354



1355
1356
1357
1358



1359

1360
1361
1362
1363
1364
1365
1366
	if {$loe > $lon} return

	# Equal locations, merge the message lists, set-like.
	set myerror [list $loe [lsort -uniq [list {*}$msgse {*}$msgsn]]]
	return
    }

    method i_error_nonterminal {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE i_error_nonterminal"







	# Inlined: Errors, Expected.
	if {![llength $myerror]} return



	set pos [$mystackloc peek]
	incr pos
	lassign $myerror loc messages
	if {$loc != $pos} return



	set myerror [list $loc [list [list n $symbol]]]

	return
    }

    # # ## ### ##### ######## ############# #####################
    ##  API - Instructions - Basic input handling and tracking

    method i_loc_pop_rewind/discard {} { ; #TRACE puts "[format %8d [incr count]] RDE i_loc_pop_rewind/discard (ok $myok ([expr {$myok ? "keep $myloc drop" : "back@"}] [$mystackloc peek]))"
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
    ##  API - Instructions - Semantic values.

    method i_value_clear {} { ; #TRACE puts "[format %8d [incr count]] RDE i_value_clear"
	set mysvalue {}
	return
    }

    method i_value_clear/leaf {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE i_value_clear/leaf ($symbol ok $myok ([expr {[$mystackloc peek]+1}])-@$myloc)"
	# not quite value_lead (guarded, and clear on fail)
	# Inlined clear, reduce, and optimized.
	# Clear ; if {$ok} {Reduce $symbol}
	set mysvalue {}
	if {!$myok} return
	set  pos [$mystackloc peek]
	incr pos

	if {($pos - 1) == $myloc} {
	    # The symbol did not process any input. As this is
	    # signaled to be ok (*) we create a node covering an empty
	    # range. (Ad *): Can happen for a RHS using toplevel
	    # operators * or ?.
	    set mysvalue [pt::ast new0 $symbol $pos]
	} else {
	    set mysvalue [pt::ast new $symbol $pos $myloc]
	}
	return
    }

    method i_value_clear/reduce {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE i_value_clear/reduce ($symbol)"
	set mysvalue {}
	if {!$myok} return

	set  mark [$mystackmark peek];# Old size of stack before current nt pushed more.
	set  newa [expr {[$mystackast size] - $mark}]

	set  pos  [$mystackloc  peek]







|




















|







1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
    ##  API - Instructions - Semantic values.

    method i_value_clear {} { ; #TRACE puts "[format %8d [incr count]] RDE i_value_clear"
	set mysvalue {}
	return
    }

    method i_value_clear/leaf {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE i_value_clear/leaf (ok $myok ([expr {[$mystackloc peek]+1}])-@$myloc)"
	# not quite value_lead (guarded, and clear on fail)
	# Inlined clear, reduce, and optimized.
	# Clear ; if {$ok} {Reduce $symbol}
	set mysvalue {}
	if {!$myok} return
	set  pos [$mystackloc peek]
	incr pos

	if {($pos - 1) == $myloc} {
	    # The symbol did not process any input. As this is
	    # signaled to be ok (*) we create a node covering an empty
	    # range. (Ad *): Can happen for a RHS using toplevel
	    # operators * or ?.
	    set mysvalue [pt::ast new0 $symbol $pos]
	} else {
	    set mysvalue [pt::ast new $symbol $pos $myloc]
	}
	return
    }

    method i_value_clear/reduce {symbol} { ; #TRACE puts "[format %8d [incr count]] RDE i_value_clear/reduce"
	set mysvalue {}
	if {!$myok} return

	set  mark [$mystackmark peek];# Old size of stack before current nt pushed more.
	set  newa [expr {[$mystackast size] - $mark}]

	set  pos  [$mystackloc  peek]
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
	}
	return
    }

    # # ## ### ##### ######## ############# #####################
    ## API - Instructions - Terminal matching

    method i_input_next {msg} { ; #TRACE puts "[format %8d [incr count]] RDE i_input_next ($msg)"
	# Inlined: Getch, Expected, ClearErrors
	# Satisfy from input cache if possible.

	incr myloc
	# May read from the input (ExtendTC), and remember the
	# information. Note: We are implicitly incrementing the
	# location!







|







1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
	}
	return
    }

    # # ## ### ##### ######## ############# #####################
    ## API - Instructions - Terminal matching

    method i_input_next {msg} { ; #TRACE puts "[format %8d [incr count]] RDE i_input_next"
	# Inlined: Getch, Expected, ClearErrors
	# Satisfy from input cache if possible.

	incr myloc
	# May read from the input (ExtendTC), and remember the
	# information. Note: We are implicitly incrementing the
	# location!
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
	} else {
	    set myerror [list $myloc [list [pt::pe terminal $tok]]]
	    incr myloc -1
	}
	return
    }

    method i_test_range {toks toke} { ; #TRACE puts "[format %8d [incr count]] RDE i_test_range ($toks $toke)"
	set myok [expr {
			([string compare $toks $mycurrent] <= 0) &&
			([string compare $mycurrent $toke] <= 0)
		    }] ; # {}
	if {$myok} {
	    set myerror {}
	} else {







|







1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
	} else {
	    set myerror [list $myloc [list [pt::pe terminal $tok]]]
	    incr myloc -1
	}
	return
    }

    method i_test_range {toks toke} { ; #TRACE puts "[format %8d [incr count]] RDE i_test_range"
	set myok [expr {
			([string compare $toks $mycurrent] <= 0) &&
			([string compare $mycurrent $toke] <= 0)
		    }] ; # {}
	if {$myok} {
	    set myerror {}
	} else {
Changes to modules/pt/rde_critcl/param.c.
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
{
    ER_CLEAR (p);
}

SCOPE void
rde_param_i_error_nonterminal (RDE_PARAM p, int s)
{
    /*
     * Disabled. Generate only low-level errors until we have worked out how
     * to integrate symbol information with them. Do not forget where this
     * instruction is inlined - No such exist, places using the instruction
     * directly call on this function.
     */
    return;

    long int pos;
    if (!p->ER) return;
    pos = 1 + (long int) rde_stack_top (p->LS);
    if (p->ER->loc != pos) return;
    error_set (p, s);
    p->ER->loc = pos;
}







<
<
<
<
<
<
<
<







539
540
541
542
543
544
545








546
547
548
549
550
551
552
{
    ER_CLEAR (p);
}

SCOPE void
rde_param_i_error_nonterminal (RDE_PARAM p, int s)
{








    long int pos;
    if (!p->ER) return;
    pos = 1 + (long int) rde_stack_top (p->LS);
    if (p->ER->loc != pos) return;
    error_set (p, s);
    p->ER->loc = pos;
}
Changes to modules/pt/rde_critcl/tc.c.
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
    long int base = tc->num;
    long int off  = tc->num;
    char* ch;
    int clen;
    Tcl_UniChar uni;

    if (len < 0) {
	len = strlen (string);
    }

    /*
     * Extend character buffer to hold the new string, and copy the string in.
     */

    if ((tc->num + len) >= tc->max) {







|







66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
    long int base = tc->num;
    long int off  = tc->num;
    char* ch;
    int clen;
    Tcl_UniChar uni;

    if (len < 0) {
	len = strlen (ch);
    }

    /*
     * Extend character buffer to hold the new string, and copy the string in.
     */

    if ((tc->num + len) >= tc->max) {
Changes to modules/pt/tests/common.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# -*- tcl -*-
# Code common to the various control files.
#
# Copyright (c) 2009-2014 by Andreas Kupries <[email protected]>
# All rights reserved.
#
# RCS: @(#) $Id: common,v 1.1 2010/03/26 05:07:24 andreas_kupries Exp $

# -------------------------------------------------------------------------

# Similar to TestFiles in devtools/testutilities.tcl, but not
# identical.  Here we do not expect source'able test suites, but data
# files, organized in sections under a main directory.

proc TestFilesProcess {maindir section inset outset -> nv lv iv dv ev script {optionalok 0}} {
    upvar 1 $nv n $lv label $dv data $ev expected $iv inputfile

    set pattern $maindir/$section/$inset/*

    set files [TestFilesGlob $pattern]
    if {![llength $files]} {
	if {$optionalok} return
	return -code error "No files matching \"$pattern\""
    }
    foreach src $files {
	if {[string match *README* $src]} continue
	if {[file isdirectory      $src]} continue

	set srcname  [file tail $src]
	set exp      [localPath $maindir]/$section/$outset/$srcname
	set data     [fileutil::cat -translation binary -encoding utf-8 $src]
	set expected [string trim [fileutil::cat -translation binary -encoding utf-8 $exp]]
	set expected [string map [list \
				      @sak   @sak \
				      @line  @line \
				      {@ %d} {@ %d} \
				      {@ %p} {@ %p} \
				      @ $::tcltest::testsDirectory] $expected]

	regexp -- {^([0-9]+)}    $srcname -> n
	regsub -all -- {^[0-9]+} $srcname {} label

	scan $n %d n
	set label [string trim [string map {_ { }} $label]]
	set inputfile $src

	uplevel 1 $script
    }
    return
}


proc TestFilesProcessIn {maindir section inset -> nv lv iv dv script} {
    upvar 1 $nv n $lv label $dv data $iv inputfile

    set pattern $maindir/$section/$inset/*

    set files [TestFilesGlob $pattern]
    if {![llength $files]} {
	return -code error "No files matching \"$pattern\""
    }
    foreach src $files {
	if {[string match *README* $src]} continue
	if {[file isdirectory      $src]} continue

	set srcname  [file tail $src]
	set data     [fileutil::cat -translation binary -encoding utf-8 $src]

	regexp -- {^([0-9]+)}    $srcname -> n
	regsub -all -- {^[0-9]+} $srcname {} label

	scan $n %d n
	set label [string trim [string map {_ { }} $label]]
	set inputfile $src




|










|






<

















<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38





























39
40
41
42
43
44
45
# -*- tcl -*-
# Code common to the various control files.
#
# Copyright (c) 2009 by Andreas Kupries <[email protected]>
# All rights reserved.
#
# RCS: @(#) $Id: common,v 1.1 2010/03/26 05:07:24 andreas_kupries Exp $

# -------------------------------------------------------------------------

# Similar to TestFiles in devtools/testutilities.tcl, but not
# identical.  Here we do not expect source'able test suites, but data
# files, organized in sections under a main directory.

proc TestFilesProcess {maindir section inset outset -> nv lv iv dv ev script} {
    upvar 1 $nv n $lv label $dv data $ev expected $iv inputfile

    set pattern $maindir/$section/$inset/*

    set files [TestFilesGlob $pattern]
    if {![llength $files]} {

	return -code error "No files matching \"$pattern\""
    }
    foreach src $files {
	if {[string match *README* $src]} continue
	if {[file isdirectory      $src]} continue

	set srcname  [file tail $src]
	set exp      [localPath $maindir]/$section/$outset/$srcname
	set data     [fileutil::cat -translation binary -encoding utf-8 $src]
	set expected [string trim [fileutil::cat -translation binary -encoding utf-8 $exp]]
	set expected [string map [list \
				      @sak   @sak \
				      @line  @line \
				      {@ %d} {@ %d} \
				      {@ %p} {@ %p} \
				      @ $::tcltest::testsDirectory] $expected]






























	regexp -- {^([0-9]+)}    $srcname -> n
	regsub -all -- {^[0-9]+} $srcname {} label

	scan $n %d n
	set label [string trim [string map {_ { }} $label]]
	set inputfile $src

267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
    }
    foreach ca [$ta children $a] cb [$tb children $b] {
	match_node $ta $ca $tb $cb
    }
    return
}

# -------------------------------------------------------------------------
## Dynamically create a parser for a PE grammar stored in a string.
## Different types:
## - critcl    -- Run through critcl tool for compilation at test time.
## - oo
## - container -- interpreter loaded from a container
## - snit

proc make-parser {format glabel grammar} {
    global pcounter
    if {![info exist pcounter]} { set pcounter 0 }

    set debug 1

    # should be preloaded by test suite.
    if {[catch {
	package present pt::pgen
    }]} {
	error "pt::pgen package required and not loaded. Please fix your testsuite."
    }

    # Options per format.
    # container :        -name
    # critcl    : -class -name
    # oo        : -class -name
    # snit      : -class -name

    lappend cmd pt::pgen peg $grammar $format -name G
    if {$format ne "container"} {
	lappend cmd -class [set gc GC[incr pcounter]]
    }

    set code [eval $cmd]

    # debugging generator output
    if {$debug} {
	puts "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $format ($glabel)"
	puts $code
	puts "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $format ($glabel)"
    }

    # Now do format-specific post-processing of the generated code to
    # get a proper parser object.

    switch -exact -- $format {
	container {
	    # should be preloaded by test suite.
	    if {[catch {
		package present pt::peg::interp
	    }]} {
		error "pt::peg::interp package required and not loaded. Please fix your testsuite."
	    }

	    # Instantiate container class (transient).
	    eval $code
	    # Instantiate container (transient).
	    set c [G %AUTO%]

	    # Instantiate PEG interpreter, and configure with grammar in container.
	    set p [pt::peg::interp %AUTO%]
	    $p use $c

	    # Clean up the transient pieces (container class and instance).
	    $c destroy
	    G destroy
	}
	snit {
	    # Instantiate the parser class.
	    # ATTENTION: We chop the last 2 lines of the code first,
	    # unwanted "package provide" and "return" commands.
	    eval [join [lrange [split $code \n] 0 end-2] \n]

	    # Instantiate a parser based on the class.
	    set p [$gc %AUTO%]
	    # Note: Cannot destroy class now, would destroy instance as well.
	}
	oo {
	    # Instantiate the parser class.
	    # ATTENTION: We chop the last 2 lines of the code first,
	    # unwanted "package provide" and "return" commands.
	    eval [join [lrange [split $code \n] 0 end-2] \n]

	    # Instantiate a parser based on the class.
	    set p [$gc new]
	    # Note: Cannot destroy class now, would destroy instance as well.
	}
	critcl {
	    # TODO:
	    # - Save to file,
	    # - Run through critcl
	    # - Load generated shlib
	    # - Instantiate parser
	    error NYI-critcl
	}
    }

    # Provide parser instance.
    if {$debug} {
	puts "P = ($p)"
	puts "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $format ($glabel)"
	puts %%
	puts %%%
    }
    return $p
}

# -------------------------------------------------------------------------
return








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

237
238
239
240
241
242
243
244










































































































245
    }
    foreach ca [$ta children $a] cb [$tb children $b] {
	match_node $ta $ca $tb $cb
    }
    return
}

# -------------------------------------------------------------------------










































































































return
Deleted modules/pt/tests/data/gr/def/0_sequence.
1
2
PEG a_pe_grammar ('a' 'b' 'c')
END;
<
<




Deleted modules/pt/tests/data/gr/def/1_sym-sequence.
1
2
3
PEG a_pe_grammar (N)
  N <- 'a' 'b' 'c';
END;
<
<
<






Deleted modules/pt/tests/data/gr/def/2_choice.
1
2
PEG a_pe_grammar ('alpha' / 'anumeric' / 'digit')
END;
<
<




Deleted modules/pt/tests/data/gr/fail-choice-container-res/0_aleph.
1
1 {pt::rde 2 {{t p}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-container-res/1_anumber.
1
1 {pt::rde 4 {{t e}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-container-res/2_digup.
1
1 {pt::rde 3 {{t i}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-container-res/3_other.
1
1 {pt::rde 0 {{t a} {t d}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-oo-res/0_aleph.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-oo-res/1_anumber.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-oo-res/2_digup.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-oo-res/3_other.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-snit-res/0_aleph.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-snit-res/1_anumber.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-snit-res/2_digup.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice-snit-res/3_other.
1
1 {pt::rde 0 {{t alpha} {t anumeric} {t digit}}}
<


Deleted modules/pt/tests/data/gr/fail-choice/0_aleph.
1
aleph
<


Deleted modules/pt/tests/data/gr/fail-choice/1_anumber.
1
anumber
<


Deleted modules/pt/tests/data/gr/fail-choice/2_digup.
1
digup
<


Deleted modules/pt/tests/data/gr/fail-choice/3_other.
1
other
<


Deleted modules/pt/tests/data/gr/fail-sequence-container-res/0_abe.
1
1 {pt::rde 2 {{t c}}}
<


Deleted modules/pt/tests/data/gr/fail-sequence-container-res/1_b.
1
1 {pt::rde 0 {{t a}}}
<


Deleted modules/pt/tests/data/gr/fail-sequence-oo-res/0_abe.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sequence-oo-res/1_b.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sequence-snit-res/0_abe.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sequence-snit-res/1_b.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sequence/0_abe.
1
abe
<


Deleted modules/pt/tests/data/gr/fail-sequence/1_b.
1
b
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence-container-res/0_abe.
1
1 {pt::rde 2 {{t c}}}
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence-container-res/1_b.
1
1 {pt::rde 0 {{t a}}}
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence-oo-res/0_abe.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence-oo-res/1_b.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence-snit-res/0_abe.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence-snit-res/1_b.
1
1 {pt::rde 0 {{t abc}}}
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence/0_abe.
1
abe
<


Deleted modules/pt/tests/data/gr/fail-sym-sequence/1_b.
1
b
<


Deleted modules/pt/tests/data/gr/ok-choice-res/0_alpha.
Deleted modules/pt/tests/data/gr/ok-choice-res/1_digit.
Deleted modules/pt/tests/data/gr/ok-choice-res/2_anumeric.
Deleted modules/pt/tests/data/gr/ok-choice/0_alpha.
1
alpha
<


Deleted modules/pt/tests/data/gr/ok-choice/1_digit.
1
digit
<


Deleted modules/pt/tests/data/gr/ok-choice/2_anumeric.
1
anumeric
<


Deleted modules/pt/tests/data/gr/ok-sequence-res/0_abc.
Deleted modules/pt/tests/data/gr/ok-sequence/0_abc.
1
abc
<


Deleted modules/pt/tests/data/gr/ok-sym-sequence-res/0_abc.
1
N 0 2
<


Deleted modules/pt/tests/data/gr/ok-sym-sequence/0_abc.
1
abc
<


Changes to modules/pt/tests/data/ok/peg_cparam-critcl/0_basic_arithmetic.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
        
        /*
         * value Symbol 'MulOp'
         */
        
        static void sym_MulOp (RDE_PARAM p) {
           /*
            * [\u002a\u002f]
            */
        
            if (rde_param_i_symbol_start (p, 14)) return ;
            rde_param_i_next_class (p, "*/", 12);
            rde_param_i_symbol_done_leaf (p, 14, 13);
            return;
        }







|







1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
        
        /*
         * value Symbol 'MulOp'
         */
        
        static void sym_MulOp (RDE_PARAM p) {
           /*
            * [*/]
            */
        
            if (rde_param_i_symbol_start (p, 14)) return ;
            rde_param_i_next_class (p, "*/", 12);
            rde_param_i_symbol_done_leaf (p, 14, 13);
            return;
        }
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/10_notahead.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/11_epsilon.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/1_functions.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/2_fun_arithmetic.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
        
        /*
         * value Symbol 'MulOp'
         */
        
        static void sym_MulOp (RDE_PARAM p) {
           /*
            * [\u002a\u002f]
            */
        
            if (rde_param_i_symbol_start (p, 16)) return ;
            rde_param_i_next_class (p, "*/", 14);
            rde_param_i_symbol_done_leaf (p, 16, 15);
            return;
        }







|







1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
        
        /*
         * value Symbol 'MulOp'
         */
        
        static void sym_MulOp (RDE_PARAM p) {
           /*
            * [*/]
            */
        
            if (rde_param_i_symbol_start (p, 16)) return ;
            rde_param_i_next_class (p, "*/", 14);
            rde_param_i_symbol_done_leaf (p, 16, 15);
            return;
        }
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/3_peg_itself.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/4_choice.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/5_sequence.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/6_optional.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/7_kleene.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/8_pkleene.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam-critcl/9_ahead.
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (string);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;







|







380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
	{
	    long int base = tc->num;
	    long int off  = tc->num;
	    char* ch;
	    int clen;
	    Tcl_UniChar uni;
	    if (len < 0) {
		len = strlen (ch);
	    }
	    
	    if ((tc->num + len) >= tc->max) {
		int   new = len + (tc->max ? (2 * tc->max) : RDE_STACK_INITIAL_SIZE);
		char* str = ckrealloc (tc->str, new * sizeof(char));
		ASSERT (str,"Memory allocation failure for token character array");
		tc->max = new;
Changes to modules/pt/tests/data/ok/peg_cparam/0_basic_arithmetic.
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295

/*
 * value Symbol 'MulOp'
 */

<<attributes>> void <<ns>>sym_MulOp (<<STATE>> <<state>>) { <<prelude>>
   /*
    * [\u002a\u002f]
    */

    if (rde_param_i_symbol_start (<<state>>, 14)) return ;
    rde_param_i_next_class (<<state>>, "*/", 12);
    rde_param_i_symbol_done_leaf (<<state>>, 14, 13);
    return;
}







|







281
282
283
284
285
286
287
288
289
290
291
292
293
294
295

/*
 * value Symbol 'MulOp'
 */

<<attributes>> void <<ns>>sym_MulOp (<<STATE>> <<state>>) { <<prelude>>
   /*
    * [*/]
    */

    if (rde_param_i_symbol_start (<<state>>, 14)) return ;
    rde_param_i_next_class (<<state>>, "*/", 12);
    rde_param_i_symbol_done_leaf (<<state>>, 14, 13);
    return;
}
Changes to modules/pt/tests/data/ok/peg_cparam/2_fun_arithmetic.
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322

/*
 * value Symbol 'MulOp'
 */

<<attributes>> void <<ns>>sym_MulOp (<<STATE>> <<state>>) { <<prelude>>
   /*
    * [\u002a\u002f]
    */

    if (rde_param_i_symbol_start (<<state>>, 16)) return ;
    rde_param_i_next_class (<<state>>, "*/", 14);
    rde_param_i_symbol_done_leaf (<<state>>, 16, 15);
    return;
}







|







308
309
310
311
312
313
314
315
316
317
318
319
320
321
322

/*
 * value Symbol 'MulOp'
 */

<<attributes>> void <<ns>>sym_MulOp (<<STATE>> <<state>>) { <<prelude>>
   /*
    * [*/]
    */

    if (rde_param_i_symbol_start (<<state>>, 16)) return ;
    rde_param_i_next_class (<<state>>, "*/", 14);
    rde_param_i_symbol_done_leaf (<<state>>, 16, 15);
    return;
}
Deleted modules/pt/tests/pt_pgen.tests.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- tcl -*-
# Testsuite for pt::pgen.
# Called by the ../pt_pgen.test driver file.

#----------------------------------------------------------------------
## I. Testing the generator operation itself

# TODO testing of the pt::pgen command API (#args, options, outputs) ...

#----------------------------------------------------------------------
## II. Using generated parsers to test behaviour on good and bad
##     input, i.e. the error handling implemented in our PEG parsers.

foreach {format notes} {
    container {grammar interpreter - reference}
    snit      {snit::type Tcl parser}
    oo        {TclOO class Tcl parser}
    critcl    {PARAM based C class parser}
} {
    # SKIP nyi ...
    if {$format in {critcl}} continue

    TestFilesProcessIn $mytestdir gr def -> n glabel grfile grdata {
	# Make parser instance. Shared across tests. Amortize the time
	# spent on dynamically making it.
	set p [make-parser $format $glabel $grdata]

	# Test parser on good inputs for the grammar.
	TestFilesProcess $mytestdir gr ok-${glabel} ok-${glabel}-res -> k label infile text expected {
	    test pt-pgen-parse:${parseimpl}-rde:${rdeimpl}-stack:${stackimpl}-f:${format}-g:${glabel}-t:${label}-1.$n.$k \
		"$format parser $glabel, good input - $label" -setup {
		} -body {
		    $p parset $text
		} -cleanup {
		} -result $expected
	}

	# Test parser on bad inputs for the grammar.
	##
	# Note how the expected output depends not only on grammar,
	# but the parser format as well. Different optimizations and
	# such leading to different instructions implementing matches.
	# Example: "next_str" vs. "sequence of next_char".

	TestFilesProcess $mytestdir gr fail-${glabel} fail-${glabel}-${format}-res -> k label infile text expected {
	    test pt-pgen-parse:${parseimpl}-rde:${rdeimpl}-stack:${stackimpl}-f:${format}-g:${glabel}-t:${label}-2.$n.$k \
		"$format parser $glabel, bad input - $label" -setup {
		} -body {
		    set code [catch {
			$p parset $text
		    } msg]
		    # TODO: Convert message to readable.
		    list $code $msg
		} -cleanup {
		} -result $expected
	} yes ;# Allow missing testsets, for two reasons:
	#      # (a) Easier during testsuite development, allowing incremental buildup
	#      # (b) Some grammar construction *cannot* fail (Ex: x*), thus we cannot provide
	#      #     failure cases either.

	# Kill shared parser instance.
	$p destroy
    }
}


#----------------------------------------------------------------------
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































Changes to modules/struct/list.tcl.
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
#
# Side effects:
#       None of its own, but the command prefix can perform arbitrary actions.

proc ::struct::list::Lfilter {sequence cmdprefix} {
    # Shortcut when nothing is to be done.
    if {[::llength $sequence] == 0} {return $sequence}
    return [uplevel 1 [::list ::struct::list::Lfold $sequence {} [::list ::struct::list::FTest $cmdprefix]]]
}

proc ::struct::list::FTest {cmdprefix result item} {
    set pass [uplevel 1 [::linsert $cmdprefix end $item]]
    if {$pass} {::lappend result $item}
    return $result
}







|







754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
#
# Side effects:
#       None of its own, but the command prefix can perform arbitrary actions.

proc ::struct::list::Lfilter {sequence cmdprefix} {
    # Shortcut when nothing is to be done.
    if {[::llength $sequence] == 0} {return $sequence}
    return [Lfold $sequence {} [::list ::struct::list::FTest $cmdprefix]]
}

proc ::struct::list::FTest {cmdprefix result item} {
    set pass [uplevel 1 [::linsert $cmdprefix end $item]]
    if {$pass} {::lappend result $item}
    return $result
}
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
	foreach {pv fv} $args break
	upvar 1 $pv pass $fv fail
	if {[::llength $sequence] == 0} {
	    set pass {}
	    set fail {}
	    return {0 0}
	}
	foreach {pass fail} [uplevel 1 [::list ::struct::list::Lfold $sequence {} [::list ::struct::list::PFTest $cmdprefix]]] break
	return [::list [llength $pass] [llength $fail]]
    } else {
	return -code error \
		"wrong#args: should be \"::struct::list::Lsplit sequence cmdprefix ?passVar failVar?"
    }
}








|







828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
	foreach {pv fv} $args break
	upvar 1 $pv pass $fv fail
	if {[::llength $sequence] == 0} {
	    set pass {}
	    set fail {}
	    return {0 0}
	}
	foreach {pass fail} [Lfold $sequence {} [::list ::struct::list::PFTest $cmdprefix]] break
	return [::list [llength $pass] [llength $fail]]
    } else {
	return -code error \
		"wrong#args: should be \"::struct::list::Lsplit sequence cmdprefix ?passVar failVar?"
    }
}

1821
1822
1823
1824
1825
1826
1827
1828
## Ready

namespace eval ::struct {
    # Get 'list::list' into the general structure namespace.
    namespace import -force list::list
    namespace export list
}
package provide struct::list 1.8.3







|
1821
1822
1823
1824
1825
1826
1827
1828
## Ready

namespace eval ::struct {
    # Get 'list::list' into the general structure namespace.
    namespace import -force list::list
    namespace export list
}
package provide struct::list 1.8.2
Changes to modules/struct/list.test.
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
    filter {3 5 7} even
} {}

test filter-4.4 {filter command} {
    filter {2 4 6} even
} {2 4 6}

# Alternate which elements are filtered by using a global variable
# flag. Used to test that the `cmdprefix' is evaluated in the caller's
# scope.
#
# The flag variable should be set on the -setup phase.

proc alternating {_} {
    upvar 1 flag flag;
    set flag [expr {!($flag)}];
    return $flag;
}

test filter-4.5 {filter evaluates cmdprefix on outer scope} -setup {
    set flag 1
} -body {
    filter {1 2 3 4 5 6} alternating
} -cleanup {
    unset flag
} -result {2 4 6}

#----------------------------------------------------------------------

interp alias {} filterfor {} ::struct::list::list filterfor

test filterfor-4.1 {filterfor command} {
    filterfor i {1 2 3 4 5 6 7 8} {($i % 2) == 0}
} {2 4 6 8}







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







496
497
498
499
500
501
502




















503
504
505
506
507
508
509
    filter {3 5 7} even
} {}

test filter-4.4 {filter command} {
    filter {2 4 6} even
} {2 4 6}





















#----------------------------------------------------------------------

interp alias {} filterfor {} ::struct::list::list filterfor

test filterfor-4.1 {filterfor command} {
    filterfor i {1 2 3 4 5 6 7 8} {($i % 2) == 0}
} {2 4 6 8}
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
    list [lsplit {3 5 7} even pass fail] $pass $fail
} {{0 3} {} {3 5 7}}

test split-4.8 {split command} {
    list [lsplit {2 4 6} even pass fail] $pass $fail
} {{3 0} {2 4 6} {}}


# See test filter-4.5 for explanations.

test split-4.9 {split evaluates cmdprefix on outer scope} -setup {
    set flag 1
} -body {
    list [lsplit {1 2 3 4 5 6 7 8} alternating pass fail] $pass $fail
} -cleanup {
    unset flag
} -result {{4 4} {2 4 6 8} {1 3 5 7}}

#----------------------------------------------------------------------

interp alias {} shift {} ::struct::list::list shift

test shift-4.1 {shift command} {
    set v {1 2 3 4 5 6 7 8}
    list [shift v] $v







<
<
<
<
<
<
<
<
<
<
<







554
555
556
557
558
559
560











561
562
563
564
565
566
567
    list [lsplit {3 5 7} even pass fail] $pass $fail
} {{0 3} {} {3 5 7}}

test split-4.8 {split command} {
    list [lsplit {2 4 6} even pass fail] $pass $fail
} {{3 0} {2 4 6} {}}












#----------------------------------------------------------------------

interp alias {} shift {} ::struct::list::list shift

test shift-4.1 {shift command} {
    set v {1 2 3 4 5 6 7 8}
    list [shift v] $v
Changes to modules/struct/matrix.man.
1
2
3
4
5
6
7
8
9
[comment {-*- tcl -*-}]
[manpage_begin struct::matrix n 2.0.3]
[keywords matrix]
[copyright {2002-2013 Andreas Kupries <[email protected]>}]
[moddesc   {Tcl Data Structures}]
[titledesc {Create and manipulate matrix objects}]
[category  {Data structures}]
[require Tcl 8.2]
[require struct::matrix [opt 2.0.3]]

|







1
2
3
4
5
6
7
8
9
[comment {-*- tcl -*-}]
[manpage_begin struct::matrix n 2.0.1]
[keywords matrix]
[copyright {2002-2013 Andreas Kupries <[email protected]>}]
[moddesc   {Tcl Data Structures}]
[titledesc {Create and manipulate matrix objects}]
[category  {Data structures}]
[require Tcl 8.2]
[require struct::matrix [opt 2.0.3]]
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
submatrix whose top-left cell is specified by the two indices. If the
sublists of the outerlist are not of equal length the shorter sublists
will be filled with empty strings to the length of the longest
sublist. If the submatrix specified by the top-left cell and the
number of rows and columns in the [arg values] extends beyond the
matrix we are modifying the over-extending parts of the values are
ignored, i.e. essentially cut off. This subcommand expects its input
in the format as returned by [method {get rect}].

[call [arg matrixName] [method {set row}] [arg {row values}]]

Sets the values in the cells identified by the row index to the
elements of the list provided as the third argument. Each element of
the list is assigned to one cell, with the first element going into
the cell in column 0 and then upward. If there are less values in the







|







432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
submatrix whose top-left cell is specified by the two indices. If the
sublists of the outerlist are not of equal length the shorter sublists
will be filled with empty strings to the length of the longest
sublist. If the submatrix specified by the top-left cell and the
number of rows and columns in the [arg values] extends beyond the
matrix we are modifying the over-extending parts of the values are
ignored, i.e. essentially cut off. This subcommand expects its input
in the format as returned by [method getrect].

[call [arg matrixName] [method {set row}] [arg {row values}]]

Sets the values in the cells identified by the row index to the
elements of the list provided as the third argument. Each element of
the list is assigned to one cell, with the first element going into
the cell in column 0 and then upward. If there are less values in the
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
The examples below assume a 5x5 matrix M with the first row containing
the values 1 to 5, with 1 in the top-left cell. Each other row
contains the contents of the row above it, rotated by one cell to the
right.

[para]
[example {
 % M get rect 0 0 4 4
 {{1 2 3 4 5} {5 1 2 3 4} {4 5 1 2 3} {3 4 5 1 2} {2 3 4 5 1}}
}]

[para]
[example {
 % M set rect 1 1 {{0 0 0} {0 0 0} {0 0 0}}
 % M get rect 0 0 4 4
 {{1 2 3 4 5} {5 0 0 0 4} {4 0 0 0 3} {3 0 0 0 2} {2 3 4 5 1}}
}]

[para]

Assuming that the style definitions in the example section of the
manpage for the package [package report] are loaded into the







|





|
|







489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
The examples below assume a 5x5 matrix M with the first row containing
the values 1 to 5, with 1 in the top-left cell. Each other row
contains the contents of the row above it, rotated by one cell to the
right.

[para]
[example {
 % M getrect 0 0 4 4
 {{1 2 3 4 5} {5 1 2 3 4} {4 5 1 2 3} {3 4 5 1 2} {2 3 4 5 1}}
}]

[para]
[example {
 % M setrect 1 1 {{0 0 0} {0 0 0} {0 0 0}}
 % M getrect 0 0 4 4
 {{1 2 3 4 5} {5 0 0 0 4} {4 0 0 0 3} {3 0 0 0 2} {2 3 4 5 1}}
}]

[para]

Assuming that the style definitions in the example section of the
manpage for the package [package report] are loaded into the
Changes to modules/struct/pkgIndex.tcl.
14
15
16
17
18
19
20
21
22
23
package ifneeded struct::skiplist  1.3   [list source [file join $dir skiplist.tcl]]

package ifneeded struct::graph     1.2.1 [list source [file join $dir graph1.tcl]]
package ifneeded struct::tree      1.2.2 [list source [file join $dir tree1.tcl]]
package ifneeded struct::matrix    1.2.1 [list source [file join $dir matrix1.tcl]]

if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded struct::list      1.8.3  [list source [file join $dir list.tcl]]
package ifneeded struct::graph     2.4    [list source [file join $dir graph.tcl]]
package ifneeded struct::graph::op 0.11.3 [list source [file join $dir graphops.tcl]]







|


14
15
16
17
18
19
20
21
22
23
package ifneeded struct::skiplist  1.3   [list source [file join $dir skiplist.tcl]]

package ifneeded struct::graph     1.2.1 [list source [file join $dir graph1.tcl]]
package ifneeded struct::tree      1.2.2 [list source [file join $dir tree1.tcl]]
package ifneeded struct::matrix    1.2.1 [list source [file join $dir matrix1.tcl]]

if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded struct::list      1.8.2  [list source [file join $dir list.tcl]]
package ifneeded struct::graph     2.4    [list source [file join $dir graph.tcl]]
package ifneeded struct::graph::op 0.11.3 [list source [file join $dir graphops.tcl]]
Changes to modules/struct/struct_list.man.
1
2
3
4
5
6
7
8
9
10
11
[comment {-*- tcl -*- doctools manpage}]
[comment {$Id: struct_list.man,v 1.24 2010/10/05 21:47:25 andreas_kupries Exp $}]
[vset LIST_VERSION 1.8.3]
[manpage_begin struct::list n [vset LIST_VERSION]]
[keywords assign]
[keywords common]
[keywords comparison]
[keywords diff]
[keywords differential]
[keywords equal]
[keywords equality]


<
|







1
2

3
4
5
6
7
8
9
10
[comment {-*- tcl -*- doctools manpage}]
[comment {$Id: struct_list.man,v 1.24 2010/10/05 21:47:25 andreas_kupries Exp $}]

[manpage_begin struct::list n 1.8.2]
[keywords assign]
[keywords common]
[keywords comparison]
[keywords diff]
[keywords differential]
[keywords equal]
[keywords equality]
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[keywords swapping]
[copyright {2003-2005 by Kevin B. Kenny. All rights reserved}]
[copyright {2003-2012 Andreas Kupries <[email protected]>}]
[moddesc {Tcl Data Structures}]
[titledesc {Procedures for manipulating lists}]
[category  {Data structures}]
[require Tcl 8.4]
[require struct::list [opt [vset LIST_VERSION]]]
[description]

[para]

The [cmd ::struct::list] namespace contains several useful commands
for processing Tcl lists. Generally speaking, they implement
algorithms more complex or specialized than the ones provided by Tcl







|







35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[keywords swapping]
[copyright {2003-2005 by Kevin B. Kenny. All rights reserved}]
[copyright {2003-2012 Andreas Kupries <[email protected]>}]
[moddesc {Tcl Data Structures}]
[titledesc {Procedures for manipulating lists}]
[category  {Data structures}]
[require Tcl 8.4]
[require struct::list [opt 1.8.2]]
[description]

[para]

The [cmd ::struct::list] namespace contains several useful commands
for processing Tcl lists. Generally speaking, they implement
algorithms more complex or specialized than the ones provided by Tcl
Changes to modules/tar/pkgIndex.tcl.
1
2
3
4
5
if {![package vsatisfies [package provide Tcl] 8.4]} {
    # PRAGMA: returnok
    return
}
package ifneeded tar 0.10 [list source [file join $dir tar.tcl]]




|
1
2
3
4
5
if {![package vsatisfies [package provide Tcl] 8.4]} {
    # PRAGMA: returnok
    return
}
package ifneeded tar 0.9 [list source [file join $dir tar.tcl]]
Changes to modules/tar/tar.man.
1
2
3
4
5
6
7
8
[vset PACKAGE_VERSION 0.10]
[comment {-*- tcl -*- doctools manpage}]
[manpage_begin tar n [vset PACKAGE_VERSION]]
[keywords archive]
[keywords {tape archive}]
[keywords tar]
[moddesc   {Tar file handling}]
[titledesc {Tar file creation, extraction & manipulation}]
|







1
2
3
4
5
6
7
8
[vset PACKAGE_VERSION 0.9]
[comment {-*- tcl -*- doctools manpage}]
[manpage_begin tar n [vset PACKAGE_VERSION]]
[keywords archive]
[keywords {tape archive}]
[keywords tar]
[moddesc   {Tar file handling}]
[titledesc {Tar file creation, extraction & manipulation}]
Changes to modules/tar/tar.tcl.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tar.tcl,v 1.17 2012/09/11 17:22:24 andreas_kupries Exp $

package require Tcl 8.4
package provide tar 0.10

namespace eval ::tar {}

proc ::tar::parseOpts {acc opts} {
    array set flags $acc
    foreach {x y} $acc {upvar $x $x}
    







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# RCS: @(#) $Id: tar.tcl,v 1.17 2012/09/11 17:22:24 andreas_kupries Exp $

package require Tcl 8.4
package provide tar 0.9

namespace eval ::tar {}

proc ::tar::parseOpts {acc opts} {
    array set flags $acc
    foreach {x y} $acc {upvar $x $x}
    
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    set ret {}
    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
	HandleLongLink $fh header
        if {$header(name) == ""} break
	if {$header(prefix) != ""} {append header(prefix) /}
        lappend ret $header(prefix)$header(name)
        seekorskip $fh [expr {$header(size) + [pad $header(size)]}] current
    }
    if {!$chan} {
	close $fh
    }
    return $ret







<







141
142
143
144
145
146
147

148
149
150
151
152
153
154
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    set ret {}
    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
	HandleLongLink $fh header
        if {$header(name) == ""} break

        lappend ret $header(prefix)$header(name)
        seekorskip $fh [expr {$header(size) + [pad $header(size)]}] current
    }
    if {!$chan} {
	close $fh
    }
    return $ret
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    set ret {}
    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
	HandleLongLink $fh header
        if {$header(name) == ""} break
	if {$header(prefix) != ""} {append header(prefix) /}
        seekorskip $fh [expr {$header(size) + [pad $header(size)]}] current
        if {$file != "" && "$header(prefix)$header(name)" != $file} {continue}
        set header(type) [string map {0 file 5 directory 3 characterSpecial 4 blockSpecial 6 fifo 2 link} $header(type)]
        set header(mode) [string range $header(mode) 2 end]
        lappend ret $header(prefix)$header(name) [list mode $header(mode) uid $header(uid) gid $header(gid) \
                    size $header(size) mtime $header(mtime) type $header(type) linkname $header(linkname) \
                    uname $header(uname) gname $header(gname) devmajor $header(devmajor) devminor $header(devminor)]







<







164
165
166
167
168
169
170

171
172
173
174
175
176
177
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    set ret {}
    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
	HandleLongLink $fh header
        if {$header(name) == ""} break

        seekorskip $fh [expr {$header(size) + [pad $header(size)]}] current
        if {$file != "" && "$header(prefix)$header(name)" != $file} {continue}
        set header(type) [string map {0 file 5 directory 3 characterSpecial 4 blockSpecial 6 fifo 2 link} $header(type)]
        set header(mode) [string range $header(mode) 2 end]
        lappend ret $header(prefix)$header(name) [list mode $header(mode) uid $header(uid) gid $header(gid) \
                    size $header(size) mtime $header(mtime) type $header(type) linkname $header(linkname) \
                    uname $header(uname) gname $header(gname) devmajor $header(devmajor) devminor $header(devminor)]
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    while {![eof $fh]} {
	set data [read $fh 512]
        array set header [readHeader $data]
	HandleLongLink $fh header
        if {$header(name) == ""} break
	if {$header(prefix) != ""} {append header(prefix) /}
        set name [string trimleft $header(prefix)$header(name) /]
        if {$name == $file} {
            set file [read $fh $header(size)]
            if {!$chan} {
		close $fh
	    }
            return $file







<







192
193
194
195
196
197
198

199
200
201
202
203
204
205
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    while {![eof $fh]} {
	set data [read $fh 512]
        array set header [readHeader $data]
	HandleLongLink $fh header
        if {$header(name) == ""} break

        set name [string trimleft $header(prefix)$header(name) /]
        if {$name == $file} {
            set file [read $fh $header(size)]
            if {!$chan} {
		close $fh
	    }
            return $file
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
	set fh [::open $tar]
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
	HandleLongLink $fh header
        if {$header(name) == ""} break
	if {$header(prefix) != ""} {append header(prefix) /}
        set name [string trimleft $header(prefix)$header(name) /]
        if {![string match $pattern $name] || ($nooverwrite && [file exists $name])} {
            seekorskip $fh [expr {$header(size) + [pad $header(size)]}] current
            continue
        }

        set name [file join $dir $name]







<







234
235
236
237
238
239
240

241
242
243
244
245
246
247
	set fh [::open $tar]
	fconfigure $fh -encoding binary -translation lf -eofchar {}
    }
    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
	HandleLongLink $fh header
        if {$header(name) == ""} break

        set name [string trimleft $header(prefix)$header(name) /]
        if {![string match $pattern $name] || ($nooverwrite && [file exists $name])} {
            seekorskip $fh [expr {$header(size) + [pad $header(size)]}] current
            continue
        }

        set name [file join $dir $name]
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
    set ouid   [format %o $A(uid)]
    set omtime [format %o $A(mtime)]
    
    set name [string trimleft $name /]
    if {[string length $name] > 255} {
        return -code error "path name over 255 chars"
    } elseif {[string length $name] > 100} {
	set common [string range $name end-99 154]
	if {[set splitpoint [string first / $common]] == -1} {
	    return -code error "path name cannot be split into prefix and name"
	}
	set prefix [string range $name 0 end-100][string range $common 0 $splitpoint-1]
	set name   [string range $common $splitpoint+1 end][string range $name 155 end]
    } else {
        set prefix ""
    }

    set header [binary format a100A8A8A8A12A12A8a1a100A6a2a32a32a8a8a155a12 \
                              $name $A(mode)\x00 $ouid\x00 $ogid\x00\
                              $osize\x00 $omtime\x00 {} $type \







<
<
<
<
|
|







373
374
375
376
377
378
379




380
381
382
383
384
385
386
387
388
    set ouid   [format %o $A(uid)]
    set omtime [format %o $A(mtime)]
    
    set name [string trimleft $name /]
    if {[string length $name] > 255} {
        return -code error "path name over 255 chars"
    } elseif {[string length $name] > 100} {




        set prefix [string range $name 0 end-100]
        set name [string range $name end-99 end]
    } else {
        set prefix ""
    }

    set header [binary format a100A8A8A8A12A12A8a1a100A6a2a32a32a8a8a155a12 \
                              $name $A(mode)\x00 $ouid\x00 $ogid\x00\
                              $osize\x00 $omtime\x00 {} $type \
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507

    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
        if {$header(name) == ""} {
            puts -nonewline $tfh [string repeat \x00 1024]
            break
        }
	if {$header(prefix) != ""} {append header(prefix) /}
        set name $header(prefix)$header(name)
        set len [expr {$header(size) + [pad $header(size)]}]
        if {[lsearch $files $name] > -1} {
            seek $fh $len current
        } else {
            seek $fh -512 current
            fcopy $fh $tfh -size [expr {$len + 512}]







<







485
486
487
488
489
490
491

492
493
494
495
496
497
498

    while {![eof $fh]} {
        array set header [readHeader [read $fh 512]]
        if {$header(name) == ""} {
            puts -nonewline $tfh [string repeat \x00 1024]
            break
        }

        set name $header(prefix)$header(name)
        set len [expr {$header(size) + [pad $header(size)]}]
        if {[lsearch $files $name] > -1} {
            seek $fh $len current
        } else {
            seek $fh -512 current
            fcopy $fh $tfh -size [expr {$len + 512}]
Changes to modules/tar/tar.test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

58
59
60
61
62
63
64
65
66
67
68

69
70
71

72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# -*- tcl -*-
# These tests are in the public domain
# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file normalize [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.5 ; # Virt channel support!
testsNeedTcltest 1.0

support {
    use          virtchannel_base/memchan.tcl tcl::chan::memchan
    useLocalFile tests/support.tcl
}
testing {
    useLocal tar.tcl tar
}

# -------------------------------------------------------------------------

test tar-stream {stream} -setup setup1 -body {
    string length [read $chan1]
} -cleanup cleanup1 -result 128000

test tar-pad {pad} -body {
    tar::pad 230 
} -result {282}

test tar-skip {skip} -setup setup1 -body {
    tar::skip $chan1 10
    lappend res [read $chan1 10]
    tar::skip $chan1 72313
    lappend res [read $chan1 10]
} -cleanup cleanup1 -result {{6 7 8 9 10} {07 13908 1}}

test tar-seekorskip-backwards {seekorskip} -constraints tcl8.6plus -setup setup1 -body {
    # The zlib push stuff is Tcl 8.6+. Properly restrict the test.
    zlib push gzip $chan1
    catch {tar::seekorskip $chan1 -10 start} cres
    lappend res $cres
    catch {tar::seekorskip $chan1 10 start} cres
    lappend res $cres
    catch {tar::seekorskip $chan1 -10 end} cres
    lappend res $cres
    catch {tar::seekorskip $chan1 10 end} cres
    lappend res $cres
    lappend res [read $chan1 10]
} -cleanup cleanup1 -match glob \
    -result [list \
		 {WHENCE=start not supported*} \
		 {WHENCE=start not supported*} \
		 {WHENCE=end not supported*} \
		 {WHENCE=end not supported*} \
		 {1 2 3 4 5 } \
		]


test tar-header {header} -body {
    set file1 [dict get $filesys Dir1 File1]
    dict set file1 path /Dir1/File1
    set header [header_posix $file1]
    set parsed [string trim [tar::readHeader $header]]
    set golden "name /Dir1/File1 mode 755 uid 13103 gid 18103 size 100 mtime 5706756101 cksum 3676 type 0 linkname {} magic ustar\0 version 00 uname {} gname {} devmajor 0 devminor 0 prefix {}"
    set len [string length $parsed]
    foreach {key value} $golden {
	if {[set value1 [dict get $parsed $key]] ne $value } {
	    lappend res [list $key $value $value1]
	}

    }
} -result {}


test tar-add {add} -setup setup1 -body {
    tar::create $chan1 [list $tmpdir/one/a $tmpdir/one/two/a $tmpdir/one/three/a] -chan
    seek $chan1 0
    lappend res {*}[tar::contents $chan1 -chan]
    seek $chan1 0
    lappend res [string trim [tar::get $chan1 $tmpdir/one/two/a -chan]]
} -cleanup cleanup1 -result {tartest/one/a tartest/one/two/a tartest/one/three/a hello2}


test tar-bug-2840180 {} -setup setup2 -body {
    tar::create $chan1 [list $tmpdir/[large-path]/a] -chan
    seek $chan1 0

    # What the package sees.
    lappend res {*}[tar::contents $chan1 -chan]
    close $chan1

    # What a regular tar package sees.
    lappend res [exec 2> $tmpfile.err tar tvf $tmpfile]
    join $res \n
} -cleanup cleanup2 -match glob \
    -result [join [list \
		       $tmpdir/[large-path]/a \
		       "* $tmpdir/[large-path]/a" \
		      ] \n]

# -------------------------------------------------------------------------
testsuiteCleanup













|







|



|



|






|











|
<
|
|
|
|
|
|
|
>
|










>



>
|








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

















83
84
# -*- tcl -*-
# These tests are in the public domain
# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file normalize [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.5 ; # Virt channel support!
testsNeedTcltest 1.0

support {
    use          virtchannel_base/memchan.tcl tcl::chan::memchan
    useLocalFile test-support.tcl
}
testing {
    useLocal tar.tcl tar
}

# -------------------------------------------------------------------------

test test-stream {} -setup setup1 -body {
    string length [read $chan1]
} -cleanup cleanup1 -result 128000

test tar-pad {} -body {
    tar::pad 230 
} -result {282}

test tar-skip {} -setup setup1 -body {
    tar::skip $chan1 10
    lappend res [read $chan1 10]
    tar::skip $chan1 72313
    lappend res [read $chan1 10]
} -cleanup cleanup1 -result {{6 7 8 9 10} {07 13908 1}}

test tar-seekorskip-backwards {} -constraints tcl8.6plus -setup setup1 -body {
    # The zlib push stuff is Tcl 8.6+. Properly restrict the test.
    zlib push gzip $chan1
    catch {tar::seekorskip $chan1 -10 start} cres
    lappend res $cres
    catch {tar::seekorskip $chan1 10 start} cres
    lappend res $cres
    catch {tar::seekorskip $chan1 -10 end} cres
    lappend res $cres
    catch {tar::seekorskip $chan1 10 end} cres
    lappend res $cres
    lappend res [read $chan1 10]
} -cleanup cleanup1 -match glob -result [

    list {WHENCE=start not supported*} \
    {WHENCE=start not supported*} \
    {WHENCE=end not supported*} \
    {WHENCE=end not supported*} \
    {1 2 3 4 5 }
    
]

test tar-header {} -body {
    set file1 [dict get $filesys Dir1 File1]
    dict set file1 path /Dir1/File1
    set header [header_posix $file1]
    set parsed [string trim [tar::readHeader $header]]
    set golden "name /Dir1/File1 mode 755 uid 13103 gid 18103 size 100 mtime 5706756101 cksum 3676 type 0 linkname {} magic ustar\0 version 00 uname {} gname {} devmajor 0 devminor 0 prefix {}"
    set len [string length $parsed]
    foreach {key value} $golden {
	if {[set value1 [dict get $parsed $key]] ne $value } {
	    lappend res [list $key $value $value1]
	}
	
    }
} -result {}


test tar-add {} -setup setup1 -body {
    tar::create $chan1 [list $tmpdir/one/a $tmpdir/one/two/a $tmpdir/one/three/a] -chan
    seek $chan1 0
    lappend res {*}[tar::contents $chan1 -chan]
    seek $chan1 0
    lappend res [string trim [tar::get $chan1 $tmpdir/one/two/a -chan]]
} -cleanup cleanup1 -result {tartest/one/a tartest/one/two/a tartest/one/three/a hello2}



















# -------------------------------------------------------------------------
testsuiteCleanup
Added modules/tar/test-support.tcl.


























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

proc stream {{size 128000}} {
    set chan [tcl::chan::memchan]
    set line {}
    while 1 {
	incr i
	set istring $i
	set ilen [string length $istring]
	if {$line ne {}} {
	    append line { }
	    incr size -1 
	}
	append line $istring
	incr size -$ilen
	if {$size < 1} {
	    set line [string range $line 0 end-[expr {abs(1-$size)}]]
	    puts $chan $line
	    break
	}

	if {$i % 10 == 0} {
	    puts $chan $line 
	    incr size -1 ;# for the [puts] newline
	    set line {}
	}
    }

    seek $chan 0
    return $chan
}

proc header_posix {tarball} {
    dict with tarball {} 
    tar::formatHeader $path \
	[dict create \
	     mode $mode \
	     type $type \
	     uid  $uid \
	     gid  $gid \
	     size $size \
	     mtime $mtime]
}

proc setup1 {} {
    variable chan1
    variable res {}
    variable tmpdir tartest

    tcltest::makeDirectory $tmpdir

    foreach directory {
	one
	one/two
	one/three
    } {
	tcltest::makeDirectory $tmpdir/$directory
	set    chan [open $tmpdir/$directory/a w]
	puts  $chan hello[incr i]
	close $chan
    }
    set chan1 [stream]
}

proc cleanup1 {} {
    variable chan1
    close $chan1
    tcltest::removeDirectory tartest
    return
}

variable filesys {
    Dir1 {
	File1 {
	    type 0
	    mode 755
	    uid 13103
	    gid 18103
	    size 100
	    mtime 5706756101
	}
    }

    Dir2 {
	File1 {
	    type 0
	    mode 644
	    uid 15103
	    gid 19103
	    size 100
	    mtime 5706776103
	}
    }
}
Deleted modules/tar/tests/support.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

proc stream {{size 128000}} {
    set chan [tcl::chan::memchan]
    set line {}
    while 1 {
	incr i
	set istring $i
	set ilen [string length $istring]
	if {$line ne {}} {
	    append line { }
	    incr size -1 
	}
	append line $istring
	incr size -$ilen
	if {$size < 1} {
	    set line [string range $line 0 end-[expr {abs(1-$size)}]]
	    puts $chan $line
	    break
	}

	if {$i % 10 == 0} {
	    puts $chan $line 
	    incr size -1 ;# for the [puts] newline
	    set line {}
	}
    }

    seek $chan 0
    return $chan
}

proc header_posix {tarball} {
    dict with tarball {} 
    tar::formatHeader $path \
	[dict create \
	     mode $mode \
	     type $type \
	     uid  $uid \
	     gid  $gid \
	     size $size \
	     mtime $mtime]
}

proc setup1 {} {
    variable chan1
    variable res {}
    variable tmpdir tartest

    tcltest::makeDirectory $tmpdir

    foreach directory {
	one
	one/two
	one/three
    } {
	tcltest::makeDirectory $tmpdir/$directory
	set    chan [open $tmpdir/$directory/a w]
	puts  $chan hello[incr i]
	close $chan
    }
    set chan1 [stream]
}

proc large-path {} {
    return aaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbaaaaa/bbbbtcllib/modules/tar
}

proc setup2 {} {
    variable chan1
    variable res {}
    variable tmpdir tartest
    variable tmpfile tarX

    tcltest::makeDirectory $tmpdir
    tcltest::makeFile {} $tmpfile

    foreach directory [list [large-path]] {
	tcltest::makeDirectory $tmpdir/$directory
	set    chan [open $tmpdir/$directory/a w]
	puts  $chan hello[incr i]
	close $chan
    }
    set chan1 [open $tmpfile w+]
}

proc cleanup1 {} {
    variable chan1
    close $chan1
    tcltest::removeDirectory tartest
    return
}

proc cleanup2 {} {
    variable chan1
    variable tmpdir
    variable tmpfile
    catch { close $chan1 }
    tcltest::removeDirectory $tmpdir
    tcltest::removeFile      $tmpfile
    tcltest::removeFile      $tmpfile.err
    return
}

variable filesys {
    Dir1 {
	File1 {
	    type 0
	    mode 755
	    uid 13103
	    gid 18103
	    size 100
	    mtime 5706756101
	}
    }

    Dir2 {
	File1 {
	    type 0
	    mode 644
	    uid 15103
	    gid 19103
	    size 100
	    mtime 5706776103
	}
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































Deleted modules/uri/uri_urn.pcx.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- tcl -*- uri_urn.pcx
# Syntax of the commands provided by package uri::urn.
#
# For use by TclDevKit's static syntax checker (v4.1+).
# See http://www.activestate.com/solutions/tcl/
# See http://aspn.activestate.com/ASPN/docs/Tcl_Dev_Kit/4.0/Checker.html#pcx_api
# for the specification of the format of the code in this file.
#

package require pcx
pcx::register uri::urn
pcx::tcldep   1.0 needs tcl 8.4

namespace eval ::uri {}
namespace eval ::uri::urn {}

#pcx::message FOO {... text ...} type
#pcx::scan <VERSION> <NAME> <RULE>

pcx::check 1.0 std ::uri::urn::quote \
    {checkSimpleArgs 0 -1 {
	checkWord
    }}

# Initialization via pcx::init.
# Use a ::uri::init procedure for non-standard initialization.
pcx::complete
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































Changes to modules/uuid/pkgIndex.tcl.
1
2
3
4
5
6
7
8
# pkgIndex.tcl - 
#
# uuid package index file
#
# $Id: pkgIndex.tcl,v 1.3 2012/11/19 19:28:24 andreas_kupries Exp $

if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded uuid 1.0.3 [list source [file join $dir uuid.tcl]]







|
1
2
3
4
5
6
7
8
# pkgIndex.tcl - 
#
# uuid package index file
#
# $Id: pkgIndex.tcl,v 1.3 2012/11/19 19:28:24 andreas_kupries Exp $

if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded uuid 1.0.2 [list source [file join $dir uuid.tcl]]
Changes to modules/uuid/uuid.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[vset UUID_VERSION 1.0.3]
[manpage_begin uuid n [vset UUID_VERSION]]
[keywords GUID]
[keywords UUID]
[moddesc {uuid}]
[copyright {2004, Pat Thoyts <[email protected]>}]
[titledesc {UUID generation and comparison}]
[category  {Hashes, checksums, and encryption}]
[require Tcl 8.2]
[require uuid [opt [vset UUID_VERSION]]]
[description]
[para]

This package provides a generator of universally unique identifiers
(UUID) also known as globally unique identifiers (GUID). This
implementation follows the draft specification from (1) although this
is actually an expired draft document.
<
|







|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

[manpage_begin uuid n 1.0.2]
[keywords GUID]
[keywords UUID]
[moddesc {uuid}]
[copyright {2004, Pat Thoyts <[email protected]>}]
[titledesc {UUID generation and comparison}]
[category  {Hashes, checksums, and encryption}]
[require Tcl 8.2]
[require uuid [opt 1.0.2]]
[description]
[para]

This package provides a generator of universally unique identifiers
(UUID) also known as globally unique identifiers (GUID). This
implementation follows the draft specification from (1) although this
is actually an expired draft document.
Changes to modules/uuid/uuid.tcl.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# uuid: scheme:
# http://www.globecom.net/ietf/draft/draft-kindel-uuid-uri-00.html
#
# Usage: uuid::uuid generate
#        uuid::uuid equal $idA $idB

namespace eval uuid {
    variable version 1.0.3
    variable accel
    array set accel {critcl 0}

    namespace export uuid

    variable uid
    if {![info exists uid]} {







|







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# uuid: scheme:
# http://www.globecom.net/ietf/draft/draft-kindel-uuid-uri-00.html
#
# Usage: uuid::uuid generate
#        uuid::uuid equal $idA $idB

namespace eval uuid {
    variable version 1.0.2
    variable accel
    array set accel {critcl 0}

    namespace export uuid

    variable uid
    if {![info exists uid]} {
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
    foreach string [generate_tcl_machinfo] {
      md5::MD5Update $tok $string
    }
    set r [md5::MD5Final $tok]
    binary scan $r c* r
    
    # 3.4: set uuid versioning fields
    lset r 8 [expr {([lindex $r 8] & 0x3F) | 0x80}]
    lset r 6 [expr {([lindex $r 6] & 0x0F) | 0x40}]
    
    return [binary format c* $r]
}

if {[string equal $tcl_platform(platform) "windows"] 
        && [package provide critcl] != {}} {







|







81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
    foreach string [generate_tcl_machinfo] {
      md5::MD5Update $tok $string
    }
    set r [md5::MD5Final $tok]
    binary scan $r c* r
    
    # 3.4: set uuid versioning fields
    lset r 8 [expr {([lindex $r 8] & 0x7F) | 0x40}]
    lset r 6 [expr {([lindex $r 6] & 0x0F) | 0x40}]
    
    return [binary format c* $r]
}

if {[string equal $tcl_platform(platform) "windows"] 
        && [package provide critcl] != {}} {
Changes to modules/websocket/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded websocket 1.3.1 [list source [file join $dir websocket.tcl]]










|
1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded websocket 1.3 [list source [file join $dir websocket.tcl]]
Changes to modules/websocket/websocket.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[comment {-*- tcl -*- doctools manpage}]
[vset WEBSOCKET_VERSION 1.3.1]
[manpage_begin websocket n [vset WEBSOCKET_VERSION]]
[see_also http]
[keywords http]
[keywords internet]
[keywords net]
[keywords {rfc 6455}]
[moddesc {websocket client and server}]
[titledesc {Tcl implementation of the websocket protocol}]
[category Networking]
[require Tcl 8.4]
[require http 2.7]
[require logger]
[require sha1]
[require base64]
[require websocket [opt [vset WEBSOCKET_VERSION]]]
[description]

[para]

NOTE: THIS DOCUMENTATION IS WORK IN PROGRESS...

[para]

<
|













|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin websocket n 1.3]
[see_also http]
[keywords http]
[keywords internet]
[keywords net]
[keywords {rfc 6455}]
[moddesc {websocket client and server}]
[titledesc {Tcl implementation of the websocket protocol}]
[category Networking]
[require Tcl 8.4]
[require http 2.7]
[require logger]
[require sha1]
[require base64]
[require websocket 1.3]
[description]

[para]

NOTE: THIS DOCUMENTATION IS WORK IN PROGRESS...

[para]
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
keepalive pings being sent along the connection.  A zero or negative
number will effectively turn off the feature.  In servers, 
[const "-keepalive"] defaults to 30 seconds, and in clients, no pings 
are initiated.
[def [const "-ping"]] is the text that is used during the automated
pings.  This text defaults to the empty string, leading to an empty ping.
[list_end]

[call [cmd ::websocket::loglevel] [opt [arg loglvl]]]

Set or query the log level of the library, which defaults to error.
Logging is built on top of the logger module, and the library makes
use of the following levels: [const debug], [const info], [const notice],
[const warn] and [const error].  When called with no argument, this procedure will
simply return the current log level.  Otherwise [arg loglvl] should contain
the desired log level.

[call [cmd ::websocket::close] [arg sock] [opt [arg code]] [opt [arg reason]]]

Gracefully close a websocket that was directly or indirectly passed to
[cmd ::websocket::takeover].  The procedure will optionally send the 
[arg code] and describing [arg reason] as part of the closure handshake.
Good defaults are provided, so that reasons for a number of known codes will
be sent back. Only the first 125 characters of a reason string will be kept and
sent as part of the handshake. The known codes are:
[list_begin definitions]
[def [const 1000]] Normal closure (the default [arg code] when none provided).
[def [const 1001]] Endpoint going away
[def [const 1002]] Protocol Error
[def [const 1003]] Received incompatible data type
[def [const 1006]] Abnormal closure
[def [const 1007]] Received data not consistent with type
[def [const 1008]] Policy violation
[def [const 1009]] Received message too big
[def [const 1010]] Missing extension
[def [const 1011]] Unexpected condition
[def [const 1015]] TLS hanshake error
[list_end]



[list_end]

[section Examples]

[para]








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







296
297
298
299
300
301
302

































303
304
305
306
307
308
309
keepalive pings being sent along the connection.  A zero or negative
number will effectively turn off the feature.  In servers, 
[const "-keepalive"] defaults to 30 seconds, and in clients, no pings 
are initiated.
[def [const "-ping"]] is the text that is used during the automated
pings.  This text defaults to the empty string, leading to an empty ping.
[list_end]


































[list_end]

[section Examples]

[para]

Changes to modules/websocket/websocket.tcl.
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# page of the library and could therefor be subject to change in the
# future.

namespace eval ::websocket {
    variable WS
    if { ! [info exists WS] } {
	array set WS {
	    loglevel       "error"
	    maxlength      16777216
	    ws_magic       "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
	    ws_version     13
	    id_gene        0
	    -keepalive     30
	    -ping          ""
	}







|







40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# page of the library and could therefor be subject to change in the
# future.

namespace eval ::websocket {
    variable WS
    if { ! [info exists WS] } {
	array set WS {
	    loglevel       "warn"
	    maxlength      16777216
	    ws_magic       "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
	    ws_version     13
	    id_gene        0
	    -keepalive     30
	    -ping          ""
	}
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
    } else {
	set dst "server"
    }
    set type [Type $Connection(read:mode)]

    # If the FIN bit is set, process the frame.
    if { $header & 0x8000 } {
	${log}::debug "Received $len bytes long $type final fragment from $dst"
	switch $opcode {
	    1 {
		# Text: decode and notify handler
		Push $sock text \
		    [encoding convertfrom utf-8 $Connection(read:msg)]
	    }
	    2 {







|







879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
    } else {
	set dst "server"
    }
    set type [Type $Connection(read:mode)]

    # If the FIN bit is set, process the frame.
    if { $header & 0x8000 } {
	${log}::debug "Received $len long $type final fragment from $dst"
	switch $opcode {
	    1 {
		# Text: decode and notify handler
		Push $sock text \
		    [encoding convertfrom utf-8 $Connection(read:msg)]
	    }
	    2 {
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040

    # Gather information about local and remote peer.
    if { [catch {fconfigure $sock -peername} sockinfo] == 0 } {
	set Connection(peername) [lindex $sockinfo 1]
	if { $Connection(peername) eq "" } {
	    set Connection(peername) [lindex $sockinfo 0]
	}
    } else {
	${log}::warn "Cannot get remote information from socket: $sockinfo"
    }
    if { [catch {fconfigure $sock -sockname} sockinfo] == 0 } {
	set Connection(sockname) [lindex $sockinfo 1]
	if { $Connection(sockname) eq "" } {
	    set Connection(sockname) [lindex $sockinfo 0]
	}
    } else {
	${log}::warn "Cannot get local information from socket: $sockinfo"
    }

    # Listen to incoming traffic on socket and make sure we ping if
    # necessary.
    fconfigure $sock -translation binary -blocking on
    fileevent $sock readable [list [namespace current]::Receiver $sock]
    Liveness $sock







<
<






<
<







1017
1018
1019
1020
1021
1022
1023


1024
1025
1026
1027
1028
1029


1030
1031
1032
1033
1034
1035
1036

    # Gather information about local and remote peer.
    if { [catch {fconfigure $sock -peername} sockinfo] == 0 } {
	set Connection(peername) [lindex $sockinfo 1]
	if { $Connection(peername) eq "" } {
	    set Connection(peername) [lindex $sockinfo 0]
	}


    }
    if { [catch {fconfigure $sock -sockname} sockinfo] == 0 } {
	set Connection(sockname) [lindex $sockinfo 1]
	if { $Connection(sockname) eq "" } {
	    set Connection(sockname) [lindex $sockinfo 0]
	}


    }

    # Listen to incoming traffic on socket and make sure we ping if
    # necessary.
    fconfigure $sock -translation binary -blocking on
    fileevent $sock readable [list [namespace current]::Receiver $sock]
    Liveness $sock
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
	    "Protocol error during WebSocket connection with $OPEN(url)" \
	    $OPEN(handler)
    }

    ::http::cleanup $token
    unset $opener;   # Always unset the temporary connection opening
		     # array
    return 0
}


# ::websocket::Finished -- Pass further on HTTP connection finalisation
#
#       Pass further to Connected whenever the HTTP operation has
#       been finished as implemented by the HTTP package.







<







1130
1131
1132
1133
1134
1135
1136

1137
1138
1139
1140
1141
1142
1143
	    "Protocol error during WebSocket connection with $OPEN(url)" \
	    $OPEN(handler)
    }

    ::http::cleanup $token
    unset $opener;   # Always unset the temporary connection opening
		     # array

}


# ::websocket::Finished -- Pass further on HTTP connection finalisation
#
#       Pass further to Connected whenever the HTTP operation has
#       been finished as implemented by the HTTP package.
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344

1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
    }
    set OPEN(nonce) [::base64::encode $OPEN(nonce)]
    set HDR(Sec-WebSocket-Key) $OPEN(nonce)
    set HDR(Sec-WebSocket-Protocol) [join $protos ", "]
    set HDR(Sec-WebSocket-Version) $WS(ws_version)
    lappend cmd -headers [array get HDR]

    # Adding our own handler to intercept the socket once connection
    # has been opened and established properly would be logical, but
    # does not work in practice since this forces the HTTP library to
    # perform a HTTP 1.0 request. Instead, we arrange to be called
    # back via -command. We force -keepalive to make sure the HTTP
    # library does not insert a "Connection: close" directive in the
    # headers, and really make sure to do whatever we can to have a
    # HTTP 1.1 connection.
    lappend cmd \

	-command [list [namespace current]::Finished $varname] \
	-keepalive 1 \
	-protocol 1.1

    # Now open the connection to the remote server using the HTTP
    # package...
    set sock ""
    if { [catch {eval $cmd} token] } {
	${log}::error "Error while opening WebSocket connection to $url: $token"
    } else {







|
|
|
|
|
<
<
|

>

|
<







1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335


1336
1337
1338
1339
1340

1341
1342
1343
1344
1345
1346
1347
    }
    set OPEN(nonce) [::base64::encode $OPEN(nonce)]
    set HDR(Sec-WebSocket-Key) $OPEN(nonce)
    set HDR(Sec-WebSocket-Protocol) [join $protos ", "]
    set HDR(Sec-WebSocket-Version) $WS(ws_version)
    lappend cmd -headers [array get HDR]

    # Add our own handler to intercept the socket once connection has
    # been opened and established properly and make sure we keep alive
    # the socket so we can continue using it. In practice, what gets
    # called is the command that is specified by -command, even though
    # we would like to intercept this earlier on.  This has to do with


    # the internals of the HTTP package.
    lappend cmd \
	-handler [list [namespace current]::Connected $varname] \
	-command [list [namespace current]::Finished $varname] \
	-keepalive 1


    # Now open the connection to the remote server using the HTTP
    # package...
    set sock ""
    if { [catch {eval $cmd} token] } {
	${log}::error "Error while opening WebSocket connection to $url: $token"
    } else {
1522
1523
1524
1525
1526
1527
1528
1529
		set Connection(-ping) $v
	    }
	}
    }
}


package provide websocket 1.3.1







|
1515
1516
1517
1518
1519
1520
1521
1522
		set Connection(-ping) $v
	    }
	}
    }
}


package provide websocket 1.3;
Deleted modules/yaml/06eef112da.data.
1
2
3
4
5
6
7
---
- &foo
- &bar
- alpha: 43
  beta:
    houston: [*foo]
    newyork:  [[*bar,[aaa]]]
<
<
<
<
<
<
<














Changes to modules/yaml/pkgIndex.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded yaml 0.3.7 [list source [file join $dir yaml.tcl]]
package ifneeded huddle 0.1.5 [list source [file join $dir huddle.tcl]]










|

1
2
3
4
5
6
7
8
9
10
11
12
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded yaml 0.3.6 [list source [file join $dir yaml.tcl]]
package ifneeded huddle 0.1.5 [list source [file join $dir huddle.tcl]]
Changes to modules/yaml/yaml.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[comment {-*- tcl -*- doctools manpage}]
[vset YAML_VERSION 0.3.7]
[manpage_begin yaml n [vset YAML_VERSION]]
[see_also base64]
[see_also huddle]
[see_also json]
[keywords {data exchange}]
[keywords huddle]
[keywords parsing]
[keywords {text processing}]
[keywords yaml]
[copyright {2008 KATO Kanryu <[email protected]>}]
[moddesc   {YAML processing}]
[titledesc {YAML Format Encoder/Decoder}]
[require Tcl 8.4]
[require yaml [opt [vset YAML_VERSION]]]
[description]
[para]

The [package yaml] package provides a simple Tcl-only library for parsing the
YAML [uri http://www.yaml.org/] data exchange format as specified in
[uri http://www.yaml.org/spec/1.1/].


<
|












|







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[comment {-*- tcl -*- doctools manpage}]

[manpage_begin yaml n 0.3.6]
[see_also base64]
[see_also huddle]
[see_also json]
[keywords {data exchange}]
[keywords huddle]
[keywords parsing]
[keywords {text processing}]
[keywords yaml]
[copyright {2008 KATO Kanryu <[email protected]>}]
[moddesc   {YAML processing}]
[titledesc {YAML Format Encoder/Decoder}]
[require Tcl 8.4]
[require yaml [opt 0.3.6]]
[description]
[para]

The [package yaml] package provides a simple Tcl-only library for parsing the
YAML [uri http://www.yaml.org/] data exchange format as specified in
[uri http://www.yaml.org/spec/1.1/].

Changes to modules/yaml/yaml.tcl.
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
#

if {$::tcl_version < 8.5} {
    package require dict
}

package provide yaml 0.3.7
package require cmdline
package require huddle


namespace eval ::yaml {
    namespace export load setOptions dict2dump list2dump
    variable data







|







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
#

if {$::tcl_version < 8.5} {
    package require dict
}

package provide yaml 0.3.6
package require cmdline
package require huddle


namespace eval ::yaml {
    namespace export load setOptions dict2dump list2dump
    variable data
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
    return $token
}

# get a space separated token
proc ::yaml::_getToken {} {
    variable data

    set reStr {^[^ \t\n,\]]+}
    set result [_getFoldedString $reStr]
    return $result
}

proc ::yaml::_skipSpaces {{commentSkip 0}} {
    variable data








|







950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
    return $token
}

# get a space separated token
proc ::yaml::_getToken {} {
    variable data

    set reStr {^[^ \t\n,]+}
    set result [_getFoldedString $reStr]
    return $result
}

proc ::yaml::_skipSpaces {{commentSkip 0}} {
    variable data

Changes to modules/yaml/yaml.test.
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
            lappend out $key $node
        }
        return $out
    }
    error
}

# ------------

test yaml-21.0.06eef112da {ticket 06eef112da} -body {
    yaml::yaml2dict -file [localPath 06eef112da.data]
} -result {{} {} {alpha 43 beta {houston {{}} newyork {{{} aaa}}}}}

# ------------
# error  .....

test yaml-1.1 "error" -body {
    set error1 {
---
- [name        , \{hr: avg \[\hr: avg\} \] ]







<
<
<
<
<
<







72
73
74
75
76
77
78






79
80
81
82
83
84
85
            lappend out $key $node
        }
        return $out
    }
    error
}







# ------------
# error  .....

test yaml-1.1 "error" -body {
    set error1 {
---
- [name        , \{hr: avg \[\hr: avg\} \] ]
Changes to modules/zip/decode.man.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[vset ZIP_DECODE_VERSION 0.6]
[comment {-*- tcl -*- doctools manpage}]
[manpage_begin zipfile::decode n [vset ZIP_DECODE_VERSION]]
[keywords decompression zip]
[copyright {2008-2014 Andreas Kupries}]
[moddesc {Zip archive handling}]
[titledesc {Access to zip archives}]
[category  File]
[require Tcl 8.4]
[require fileutil::magic::mimetype]
[require fileutil::decode 0.2]
[require Trf]
[require zlibtcl]
[require zipfile::decode [opt [vset ZIP_DECODE_VERSION]]]
[description]
[para]

This package provides commands to decompress and access the contents
of zip archives.

[section API]
<

|

|








|








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

[comment {-*- tcl -*- doctools manpage}]
[manpage_begin zipfile::encode n 0.3]
[keywords decompression zip]
[copyright {2008-2012 Andreas Kupries}]
[moddesc {Zip archive handling}]
[titledesc {Access to zip archives}]
[category  File]
[require Tcl 8.4]
[require fileutil::magic::mimetype]
[require fileutil::decode 0.2]
[require Trf]
[require zlibtcl]
[require zipfile::decode [opt 0.4]]
[description]
[para]

This package provides commands to decompress and access the contents
of zip archives.

[section API]
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
This command takes a dictionary describing the currently open zip
archive file, as returned by [cmd ::zipfile::decode::archive], and
check if the specified [arg path] is found in the archive.

The result of the command is a boolean flag, [const true] if the path
is found, and [const false] otherwise.

[comment ---------------------------------------------------------------------]
[call [cmd ::zipfile::decode::iszip] [arg archive]]

This command takes the path of a presumed zip [arg archive] file and
returns a boolean flag as the result of the command telling us if it
actually is a zip archive ([const true]), or not ([const false]).

[comment ---------------------------------------------------------------------]
[call [cmd ::zipfile::decode::open] [arg archive]]

This command takes the path of a zip [arg archive] file and prepares
it for decoding.

The result of the command is the empty string.







<
<
<
<
<
<
<







87
88
89
90
91
92
93







94
95
96
97
98
99
100
This command takes a dictionary describing the currently open zip
archive file, as returned by [cmd ::zipfile::decode::archive], and
check if the specified [arg path] is found in the archive.

The result of the command is a boolean flag, [const true] if the path
is found, and [const false] otherwise.








[comment ---------------------------------------------------------------------]
[call [cmd ::zipfile::decode::open] [arg archive]]

This command takes the path of a zip [arg archive] file and prepares
it for decoding.

The result of the command is the empty string.
Changes to modules/zip/decode.tcl.
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    zipfile::decode::close
    return $f
}

# ### ### ### ######### ######### #########
##

proc ::zipfile::decode::iszip {fname} {
    if {[catch {
	LocateEnd $fname
    } msg]} {
	return 0
    }
    return 1
}

proc ::zipfile::decode::open {fname} {
    variable eoa
    if {[catch {
	set eoa [LocateEnd $fname]
    } msg]} {
	return -code error -errorcode {ZIP DECODE BAD ARCHIVE} \
	    "\"$fname\" is not a zip file"







<
<
<
<
<
<
<
<
<







36
37
38
39
40
41
42









43
44
45
46
47
48
49
    zipfile::decode::close
    return $f
}

# ### ### ### ######### ######### #########
##










proc ::zipfile::decode::open {fname} {
    variable eoa
    if {[catch {
	set eoa [LocateEnd $fname]
    } msg]} {
	return -code error -errorcode {ZIP DECODE BAD ARCHIVE} \
	    "\"$fname\" is not a zip file"
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
	# permission. A value of 0 indicates an older teabag where
	# the encoder did not yet support permissions. These we do not
	# change from the sustem defaults. Permissions are in the
	# lower 9 bits of the MSW.

	file attributes $dst -permissions \
	    [string map {0 --- 1 --x 2 -w- 3 -wx 4 r-- 5 r-x 6 rw- 7 rwx} \
		 [format %03o [expr {($fd(efattr) >> 16) & 0x1ff}]]]
    }

    # FUTURE: Run crc checksum on created file and compare to the
    # ......: stored information.

    return
}







|







176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
	# permission. A value of 0 indicates an older teabag where
	# the encoder did not yet support permissions. These we do not
	# change from the sustem defaults. Permissions are in the
	# lower 9 bits of the MSW.

	file attributes $dst -permissions \
	    [string map {0 --- 1 --x 2 -w- 3 -wx 4 r-- 5 r-x 6 rw- 7 rwx} \
		 [format %o [expr {($fd(efattr) >> 16) & 0x1ff}]]]
    }

    # FUTURE: Run crc checksum on created file and compare to the
    # ......: stored information.

    return
}
671
672
673
674
675
676
677
678
679
    #--------------
    ::close $fd
    return [array get cb]
}

# ### ### ### ######### ######### #########
## Ready
package provide zipfile::decode 0.6.1
return







|

662
663
664
665
666
667
668
669
670
    #--------------
    ::close $fd
    return [array get cb]
}

# ### ### ### ######### ######### #########
## Ready
package provide zipfile::decode 0.4
return
Changes to modules/zip/pkgIndex.tcl.
1
2
3
if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded zipfile::encode 0.3 [list source [file join $dir encode.tcl]]
package ifneeded zipfile::decode 0.6.1 [list source [file join $dir decode.tcl]]


|
1
2
3
if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded zipfile::encode 0.3 [list source [file join $dir encode.tcl]]
package ifneeded zipfile::decode 0.4 [list source [file join $dir decode.tcl]]
Changes to sak.tcl.
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
    gd-gen-rpmspec
    puts "Created RPM spec file \"${package_name}.spec\""
}


proc __release {} {
    # Regenerate PACKAGES, and extend
    gd-gen-packages
    return

    global argv argv0 distribution package_name package_version

    getpackage textutil textutil/textutil.tcl

    if {[llength $argv] != 2} {
	puts stderr "$argv0: wrong#args: release name sf-user-id"







<
<







2173
2174
2175
2176
2177
2178
2179


2180
2181
2182
2183
2184
2185
2186
    gd-gen-rpmspec
    puts "Created RPM spec file \"${package_name}.spec\""
}


proc __release {} {
    # Regenerate PACKAGES, and extend



    global argv argv0 distribution package_name package_version

    getpackage textutil textutil/textutil.tcl

    if {[llength $argv] != 2} {
	puts stderr "$argv0: wrong#args: release name sf-user-id"
Changes to support/devel/sak/doc/kwic.txt.
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
[manpage modules/debug/debug_timestamp.man debug::timestamp]
[key decimal]
[manpage modules/math/decimal.man math::decimal]
[key declare]
[manpage modules/term/ansi_code.man term::ansi::code]
[key decompression]
[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
[manpage modules/zip/decode.man                        zipfile::decode]
[key decryption]
[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
[manpage modules/virtchannel_transform/rot.man    tcl::transform::rot]
[key deferal]
[manpage modules/uev/uevent_onidle.man uevent::onidle]
[key define]
[manpage modules/term/ansi_code.man term::ansi::code]







|







620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
[manpage modules/debug/debug_timestamp.man debug::timestamp]
[key decimal]
[manpage modules/math/decimal.man math::decimal]
[key declare]
[manpage modules/term/ansi_code.man term::ansi::code]
[key decompression]
[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
[manpage modules/zip/decode.man                        zipfile::encode]
[key decryption]
[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
[manpage modules/virtchannel_transform/rot.man    tcl::transform::rot]
[key deferal]
[manpage modules/uev/uevent_onidle.man uevent::onidle]
[key define]
[manpage modules/term/ansi_code.man term::ansi::code]
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
[manpage modules/base64/yencode.man yencode]
[key yencode]
[manpage modules/base64/yencode.man yencode]
[key zero]
[manpage modules/virtchannel_base/nullzero.man    tcl::chan::nullzero]
[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
[key zip]
[manpage modules/zip/decode.man zipfile::decode]
[manpage modules/zip/encode.man zipfile::encode]
[key zlib]
[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
[key zoom]
[manpage modules/map/map_slippy.man         map::slippy]
[manpage modules/map/map_slippy_cache.man   map::slippy::cache]
[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
[index_end]







|








3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
[manpage modules/base64/yencode.man yencode]
[key yencode]
[manpage modules/base64/yencode.man yencode]
[key zero]
[manpage modules/virtchannel_base/nullzero.man    tcl::chan::nullzero]
[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
[key zip]
[manpage modules/zip/decode.man zipfile::encode]
[manpage modules/zip/encode.man zipfile::encode]
[key zlib]
[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
[key zoom]
[manpage modules/map/map_slippy.man         map::slippy]
[manpage modules/map/map_slippy_cache.man   map::slippy::cache]
[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
[index_end]
Changes to support/devel/sak/doc/toc.txt.
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
[item apps/dtplite.man                            dtplite                     {Lightweight DocTools Markup Processor}]
[item modules/doctools/mpexpand.man               mpexpand                    {Markup processor}]
[item apps/tcldocstrip.man                        tcldocstrip                 {Tcl-based Docstrip Processor}]
[item modules/tepam/tepam_doc_gen.man             tepam::doc_gen              {TEPAM DOC Generation, reference manual}]
[item modules/textutil/expander.man               textutil::expander          {Procedures to process templates and expand text.}]
[division_end]
[division_start File]
[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_start {File formats}]
[item modules/exif/exif.man exif {Tcl EXIF extracts and parses EXIF fields from digital images}]
[item modules/gpx/gpx.man   gpx  {Extracts waypoints, tracks and routes from GPX files}]
[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
[item modules/png/png.man   png  {PNG querying and manipulation of meta data}]







|







136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
[item apps/dtplite.man                            dtplite                     {Lightweight DocTools Markup Processor}]
[item modules/doctools/mpexpand.man               mpexpand                    {Markup processor}]
[item apps/tcldocstrip.man                        tcldocstrip                 {Tcl-based Docstrip Processor}]
[item modules/tepam/tepam_doc_gen.man             tepam::doc_gen              {TEPAM DOC Generation, reference manual}]
[item modules/textutil/expander.man               textutil::expander          {Procedures to process templates and expand text.}]
[division_end]
[division_start File]
[item modules/zip/decode.man zipfile::encode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_start {File formats}]
[item modules/exif/exif.man exif {Tcl EXIF extracts and parses EXIF fields from digital images}]
[item modules/gpx/gpx.man   gpx  {Extracts waypoints, tracks and routes from GPX files}]
[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
[item modules/png/png.man   png  {PNG querying and manipulation of meta data}]
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
[item modules/wip/wip.man wip {Word Interpreter}]
[division_end]
[division_start yaml]
[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
[item modules/yaml/yaml.man   yaml   {YAML Format Encoder/Decoder}]
[division_end]
[division_start zip]
[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_end]
[division_end]
[toc_end]







|





1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
[item modules/wip/wip.man wip {Word Interpreter}]
[division_end]
[division_start yaml]
[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
[item modules/yaml/yaml.man   yaml   {YAML Format Encoder/Decoder}]
[division_end]
[division_start zip]
[item modules/zip/decode.man zipfile::encode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_end]
[division_end]
[toc_end]
Changes to support/devel/sak/doc/toc_cats.txt.
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
[item apps/dtplite.man                            dtplite                     {Lightweight DocTools Markup Processor}]
[item modules/doctools/mpexpand.man               mpexpand                    {Markup processor}]
[item apps/tcldocstrip.man                        tcldocstrip                 {Tcl-based Docstrip Processor}]
[item modules/tepam/tepam_doc_gen.man             tepam::doc_gen              {TEPAM DOC Generation, reference manual}]
[item modules/textutil/expander.man               textutil::expander          {Procedures to process templates and expand text.}]
[division_end]
[division_start File]
[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_start {File formats}]
[item modules/exif/exif.man exif {Tcl EXIF extracts and parses EXIF fields from digital images}]
[item modules/gpx/gpx.man   gpx  {Extracts waypoints, tracks and routes from GPX files}]
[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
[item modules/png/png.man   png  {PNG querying and manipulation of meta data}]







|







136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
[item apps/dtplite.man                            dtplite                     {Lightweight DocTools Markup Processor}]
[item modules/doctools/mpexpand.man               mpexpand                    {Markup processor}]
[item apps/tcldocstrip.man                        tcldocstrip                 {Tcl-based Docstrip Processor}]
[item modules/tepam/tepam_doc_gen.man             tepam::doc_gen              {TEPAM DOC Generation, reference manual}]
[item modules/textutil/expander.man               textutil::expander          {Procedures to process templates and expand text.}]
[division_end]
[division_start File]
[item modules/zip/decode.man zipfile::encode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_start {File formats}]
[item modules/exif/exif.man exif {Tcl EXIF extracts and parses EXIF fields from digital images}]
[item modules/gpx/gpx.man   gpx  {Extracts waypoints, tracks and routes from GPX files}]
[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
[item modules/png/png.man   png  {PNG querying and manipulation of meta data}]
Changes to support/devel/sak/doc/toc_mods.txt.
620
621
622
623
624
625
626
627
628
629
630
631
[item modules/wip/wip.man wip {Word Interpreter}]
[division_end]
[division_start yaml]
[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
[item modules/yaml/yaml.man   yaml   {YAML Format Encoder/Decoder}]
[division_end]
[division_start zip]
[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_end]
[toc_end]







|




620
621
622
623
624
625
626
627
628
629
630
631
[item modules/wip/wip.man wip {Word Interpreter}]
[division_end]
[division_start yaml]
[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
[item modules/yaml/yaml.man   yaml   {YAML Format Encoder/Decoder}]
[division_end]
[division_start zip]
[item modules/zip/decode.man zipfile::encode {Access to zip archives}]
[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
[division_end]
[division_end]
[toc_end]
Changes to support/installation/actions.tcl.
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

proc _tcr {module libdir} {
    global distribution
    xcopy \
	    [file join $distribution modules $module] \
	    [file join $libdir $module] \
	    1 *.tcl
    return
}

proc _rde {module libdir} {
    global distribution

    _tcl $module $libdir
    xcopy \
	    [file join $distribution modules $module rde_critcl] \
	    [file join $libdir $module rde_critcl] \
	    1
    return
}

proc _doc {module libdir} {
    global distribution

    _tcl $module $libdir







<
<
<
<
<
<
<
<
<
<
<







19
20
21
22
23
24
25











26
27
28
29
30
31
32

proc _tcr {module libdir} {
    global distribution
    xcopy \
	    [file join $distribution modules $module] \
	    [file join $libdir $module] \
	    1 *.tcl











    return
}

proc _doc {module libdir} {
    global distribution

    _tcl $module $libdir
Changes to support/installation/modules.tcl.
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Module  page         _trt _man  _null
Module  pki         _tcl  _man  _null
Module  pluginmgr   _tcl  _man  _null
Module  png         _tcl  _man  _null
Module  pop3        _tcl  _man  _null
Module  pop3d       _tcl  _man  _null
Module  profiler    _tcl  _man  _null
Module  pt           _rde _man  _null
Module  rc4         _tcl  _man  _null
Module  rcs         _tcl  _man  _null
Module  report      _tcl  _man  _null
Module  rest        _tcl  _man  _null
Module  ripemd      _tcl  _man  _null
Module  sasl        _tcl  _man  _exa
Module  sha1        _tcl  _man  _null







|







107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Module  page         _trt _man  _null
Module  pki         _tcl  _man  _null
Module  pluginmgr   _tcl  _man  _null
Module  png         _tcl  _man  _null
Module  pop3        _tcl  _man  _null
Module  pop3d       _tcl  _man  _null
Module  profiler    _tcl  _man  _null
Module  pt          _tcl  _man  _null
Module  rc4         _tcl  _man  _null
Module  rcs         _tcl  _man  _null
Module  report      _tcl  _man  _null
Module  rest        _tcl  _man  _null
Module  ripemd      _tcl  _man  _null
Module  sasl        _tcl  _man  _exa
Module  sha1        _tcl  _man  _null
Changes to support/releases/PACKAGES.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@@ RELEASE 1.16

S3                                 1.0.0
SASL                               1.3.3
SASL::NTLM                         1.1.2
SASL::SCRAM                        0.1
SASL::XGoogleToken                 1.0.1
aes                                1.1.1
ascii85                            1.0
asn                                0.8.4
autoproxy                          1.5.3
base32                             0.1
base32::core                       0.1
base32::hex                        0.1
base64                             2.4.2
|


|
|
<

|







1
2
3
4
5

6
7
8
9
10
11
12
13
14
@@ RELEASE 1.15

S3                                 1.0.0
SASL                               1.3.2
SASL::NTLM                         1.1.1

SASL::XGoogleToken                 1.0.1
aes                                1.1
ascii85                            1.0
asn                                0.8.4
autoproxy                          1.5.3
base32                             0.1
base32::core                       0.1
base32::hex                        0.1
base64                             2.4.2
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
clock::iso8601                     0.1
clock::rfc2822                     0.1
cmdline                            1.3.3
comm                               4.6.2
configuration                      1
control                            0.1.3
coroutine                          1.1
coroutine::auto                    1.1.1
counter                            2.0.4
crc16                              1.1.2
crc32                              1.3.1
csv                                0.8
debug                              1.0.2
debug::caller                      1
debug::heartbeat                   1
debug::timestamp                   1
des                                1.1.0
dns                                1.3.3
docstrip                           1.2
docstrip::util                     1.3
doctools                           1.4.17
doctools::changelog                1.1
doctools::config                   0.1
doctools::cvs                      1
doctools::html                     0.1
doctools::html::cssdefaults        0.1
doctools::idx                      1.0.4
doctools::idx                      2
doctools::idx::export              0.1







|




<
<
<
<




|
|







26
27
28
29
30
31
32
33
34
35
36
37




38
39
40
41
42
43
44
45
46
47
48
49
50
clock::iso8601                     0.1
clock::rfc2822                     0.1
cmdline                            1.3.3
comm                               4.6.2
configuration                      1
control                            0.1.3
coroutine                          1.1
coroutine::auto                    1.1
counter                            2.0.4
crc16                              1.1.2
crc32                              1.3.1
csv                                0.8




des                                1.1.0
dns                                1.3.3
docstrip                           1.2
docstrip::util                     1.3
doctools                           1.4.14
doctools::changelog                1
doctools::config                   0.1
doctools::cvs                      1
doctools::html                     0.1
doctools::html::cssdefaults        0.1
doctools::idx                      1.0.4
doctools::idx                      2
doctools::idx::export              0.1
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
doctools::toc::export::text        0.1
doctools::toc::export::wiki        0.1
doctools::toc::import              0.1
doctools::toc::import::doctoc      0.1
doctools::toc::import::json        0.1
doctools::toc::parse               0.1
doctools::toc::structure           0.1
dtplite                            1.1
exif                               1.1.2
fileutil                           1.14.6
fileutil::decode                   0.2
fileutil::magic::cfront            1.0
fileutil::magic::cgen              1.0
fileutil::magic::filetype          1.0.2
fileutil::magic::mimetype          1.0.2
fileutil::magic::rt                1.0
fileutil::multi                    0.1
fileutil::multi::op                0.5.3
fileutil::traverse                 0.4.3
ftp                                2.4.12
ftp::geturl                        0.2.1
ftpd                               1.2.6
generator                          0.1
gpx                                1
grammar::aycock                    1.0
grammar::aycock::debug             1.0
grammar::aycock::runtime           1.0
grammar::fa                        0.5
grammar::fa::dacceptor             0.1.1
grammar::fa::dexec                 0.2
grammar::fa::op                    0.4.1
grammar::me::cpu                   0.2
grammar::me::cpu::core             0.2
grammar::me::cpu::gasm             0.1
grammar::me::tcl                   0.1
grammar::me::util                  0.1
grammar::peg                       0.2
grammar::peg::interp               0.1.1
hook                               0.1
html                               1.4
htmlparse                          1.2.1
huddle                             0.1.5
ident                              0.42
imap4                              0.5.2
inifile                            0.2.5
interp                             0.1.2
interp::delegate::method           0.2
interp::delegate::proc             0.2
ip                                 1.2.2
irc                                0.6.1
javascript                         1.0.2
jpeg                               0.5
json                               1.3.2
json::write                        1.0.2
lambda                             1
ldap                               1.8
ldapx                              1.0
log                                1.3
logger                             0.9.3
logger::appender                   1.3
logger::utils                      1.3
map::geocode::nominatim            0.1
map::slippy                        0.5
map::slippy::cache                 0.2
map::slippy::fetcher               0.3
mapproj                            1.0
math                               1.2.5
math::bigfloat                     1.2.2
math::bigfloat                     2.0.1
math::bignum                       3.1.1
math::calculus                     0.7.2
math::calculus::symdiff            1.0
math::complexnumbers               1.0.2
math::constants                    1.0.1
math::decimal                      1.0.3
math::fourier                      1.0.2
math::fuzzy                        0.2.1
math::geometry                     1.1.3
math::interpolate                  1.1
math::linearalgebra                1.1.4
math::machineparameters            0.1
math::numtheory                    1.0
math::optimize                     1.0
math::polynomials                  1.0.1
math::rationalfunctions            1.0.1
math::roman                        1.0
math::special                      0.2.2
math::statistics                   0.9
md4                                1.0.5
md5                                1.4.4
md5                                2.0.7
md5crypt                           1.1.0
mime                               1.6
multiplexer                        0.2
nameserv                           0.4.2
nameserv::auto                     0.3
nameserv::common                   0.1
nameserv::server                   0.3.2
namespacex                         0.1
ncgi                               1.4.2
nmea                               1.0.0
nntp                               0.2.1
oo::util                           1.2
otp                                1.0.0
page::analysis::peg::emodes        0.1
page::analysis::peg::minimize      0.1
page::analysis::peg::reachable     0.1
page::analysis::peg::realizable    0.1
page::compiler::peg::mecpu         0.1.1
page::config::peg                  0.1







<

|
|








|







|















|




|


|
|

















|



|


|
|








|




|






|


|







82
83
84
85
86
87
88

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
doctools::toc::export::text        0.1
doctools::toc::export::wiki        0.1
doctools::toc::import              0.1
doctools::toc::import::doctoc      0.1
doctools::toc::import::json        0.1
doctools::toc::parse               0.1
doctools::toc::structure           0.1

exif                               1.1.2
fileutil                           1.14.5
fileutil::decode                   0.1
fileutil::magic::cfront            1.0
fileutil::magic::cgen              1.0
fileutil::magic::filetype          1.0.2
fileutil::magic::mimetype          1.0.2
fileutil::magic::rt                1.0
fileutil::multi                    0.1
fileutil::multi::op                0.5.3
fileutil::traverse                 0.4.3
ftp                                2.4.11
ftp::geturl                        0.2.1
ftpd                               1.2.6
generator                          0.1
gpx                                1
grammar::aycock                    1.0
grammar::aycock::debug             1.0
grammar::aycock::runtime           1.0
grammar::fa                        0.4
grammar::fa::dacceptor             0.1.1
grammar::fa::dexec                 0.2
grammar::fa::op                    0.4.1
grammar::me::cpu                   0.2
grammar::me::cpu::core             0.2
grammar::me::cpu::gasm             0.1
grammar::me::tcl                   0.1
grammar::me::util                  0.1
grammar::peg                       0.2
grammar::peg::interp               0.1.1
hook                               0.1
html                               1.4
htmlparse                          1.2.1
huddle                             0.1.5
ident                              0.42
imap4                              0.4
inifile                            0.2.5
interp                             0.1.2
interp::delegate::method           0.2
interp::delegate::proc             0.2
ip                                 1.2
irc                                0.6.1
javascript                         1.0.2
jpeg                               0.4.0
json                               1.1.2
json::write                        1.0.2
lambda                             1
ldap                               1.8
ldapx                              1.0
log                                1.3
logger                             0.9.3
logger::appender                   1.3
logger::utils                      1.3
map::geocode::nominatim            0.1
map::slippy                        0.5
map::slippy::cache                 0.2
map::slippy::fetcher               0.3
mapproj                            1.0
math                               1.2.5
math::bigfloat                     1.2.2
math::bigfloat                     2.0.1
math::bignum                       3.1.1
math::calculus                     0.7.1
math::calculus::symdiff            1.0
math::complexnumbers               1.0.2
math::constants                    1.0.1
math::decimal                      1.0.2
math::fourier                      1.0.2
math::fuzzy                        0.2.1
math::geometry                     1.1.2
math::interpolate                  1.0.3
math::linearalgebra                1.1.4
math::machineparameters            0.1
math::numtheory                    1.0
math::optimize                     1.0
math::polynomials                  1.0.1
math::rationalfunctions            1.0.1
math::roman                        1.0
math::special                      0.2.2
math::statistics                   0.8.0
md4                                1.0.5
md5                                1.4.4
md5                                2.0.7
md5crypt                           1.1.0
mime                               1.5.6
multiplexer                        0.2
nameserv                           0.4.2
nameserv::auto                     0.3
nameserv::common                   0.1
nameserv::server                   0.3.2
namespacex                         0.1
ncgi                               1.4.1
nmea                               1.0.0
nntp                               0.2.1
oo::util                           1.1
otp                                1.0.0
page::analysis::peg::emodes        0.1
page::analysis::peg::minimize      0.1
page::analysis::peg::reachable     0.1
page::analysis::peg::realizable    0.1
page::compiler::peg::mecpu         0.1.1
page::config::peg                  0.1
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
pt::peg::container                 1
pt::peg::container::peg            1
pt::peg::export                    1
pt::peg::export::container         1
pt::peg::export::json              1
pt::peg::export::peg               1
pt::peg::from::json                1
pt::peg::from::peg                 1.0.2
pt::peg::import                    1
pt::peg::import::json              1
pt::peg::import::peg               1
pt::peg::interp                    1
pt::peg::op                        1.0.1
pt::peg::to::container             1
pt::peg::to::cparam                1.0.1
pt::peg::to::json                  1
pt::peg::to::param                 1
pt::peg::to::peg                   1.0.1
pt::peg::to::tclparam              1
pt::pgen                           1.0.2
pt::rde                            1.0.2
pt::rde::oo                        1.0.2
pt::tclparam::configuration::snit  1.0.1
pt::tclparam::configuration::tcloo 1.0.3
rc4                                1.1.0
rcs                                0.1
report                             0.3.1
resolv                             1.0.3
rest                               1.0.1
ripemd128                          1.0.4
ripemd160                          1.0.4
sha1                               1.1.0
sha1                               2.0.3
sha256                             1.0.3
simulation::annealing              0.2
simulation::montecarlo             0.1
simulation::random                 0.3.1
smtp                               1.4.5
smtpd                              1.5
snit                               1.4.2
snit                               2.3.2
soundex                            1.0
spf                                1.1.1
stooop                             4.4.1
string::token                      1
string::token::shell               1.1
stringprep                         1.0.1
stringprep::data                   1.0.1
struct                             1.4
struct                             2.1
struct::disjointset                1.0
struct::graph                      1.2.1
struct::graph                      2.4
struct::graph::op                  0.11.3
struct::list                       1.8.3
struct::matrix                     1.2.1
struct::matrix                     2.0.3
struct::pool                       1.2.1
struct::prioqueue                  1.4
struct::queue                      1.4.5
struct::record                     1.2.1
struct::set                        2.2.3
struct::skiplist                   1.3
struct::stack                      1.5.3
struct::tree                       1.2.2
struct::tree                       2.1.2
sum                                1.1.0
switched                           2.2.1
tar                                0.9
tcl::chan::cat                     1.0.2
tcl::chan::core                    1
tcl::chan::events                  1
tcl::chan::facade                  1.0.1
tcl::chan::fifo                    1
tcl::chan::fifo2                   1
tcl::chan::halfpipe                1
tcl::chan::memchan                 1.0.3
tcl::chan::null                    1
tcl::chan::nullzero                1
tcl::chan::random                  1
tcl::chan::std                     1.0.1
tcl::chan::string                  1.0.2
tcl::chan::textwindow              1
tcl::chan::variable                1.0.3
tcl::chan::zero                    1
tcl::randomseed                    1
tcl::transform::adler32            1
tcl::transform::base64             1
tcl::transform::core               1
tcl::transform::counter            1
tcl::transform::crc32              1
tcl::transform::hex                1
tcl::transform::identity           1
tcl::transform::limitsize          1
tcl::transform::observe            1
tcl::transform::otp                1
tcl::transform::rot                1
tcl::transform::spacer             1
tcl::transform::zlib               1
tclDES                             1.0.0
tclDESjr                           1.0.0
tepam                              0.5.0
tepam::doc_gen                     0.1.1
term                               0.1
term::ansi::code                   0.2
term::ansi::code::attr             0.1
term::ansi::code::ctrl             0.2
term::ansi::code::macros           0.1
term::ansi::ctrl::unix             0.1.1
term::ansi::send                   0.2
term::interact::menu               0.1
term::interact::pager              0.1
term::receive                      0.1
term::receive::bind                0.1
term::send                         0.1
text::write                        1
textutil                           0.8
textutil::adjust                   0.7.1
textutil::expander                 1.3.1
textutil::repeat                   0.7
textutil::split                    0.7
textutil::string                   0.8
textutil::tabify                   0.7
textutil::trim                     0.7
tie                                1.1
tie::std::array                    1.0
tie::std::dsource                  1.0
tie::std::file                     1.0.4
tie::std::growfile                 1.0







|




|




|

|

<

|




|















<
<








|

|


|








|







|




|

|

















|
<

|

|


|






|




|







241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261

262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283


284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339

340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
pt::peg::container                 1
pt::peg::container::peg            1
pt::peg::export                    1
pt::peg::export::container         1
pt::peg::export::json              1
pt::peg::export::peg               1
pt::peg::from::json                1
pt::peg::from::peg                 1
pt::peg::import                    1
pt::peg::import::json              1
pt::peg::import::peg               1
pt::peg::interp                    1
pt::peg::op                        1
pt::peg::to::container             1
pt::peg::to::cparam                1.0.1
pt::peg::to::json                  1
pt::peg::to::param                 1
pt::peg::to::peg                   1
pt::peg::to::tclparam              1
pt::pgen                           1.0.1
pt::rde                            1.0.2

pt::tclparam::configuration::snit  1.0.1
pt::tclparam::configuration::tcloo 1.0.2
rc4                                1.1.0
rcs                                0.1
report                             0.3.1
resolv                             1.0.3
rest                               1.0
ripemd128                          1.0.4
ripemd160                          1.0.4
sha1                               1.1.0
sha1                               2.0.3
sha256                             1.0.3
simulation::annealing              0.2
simulation::montecarlo             0.1
simulation::random                 0.3.1
smtp                               1.4.5
smtpd                              1.5
snit                               1.4.2
snit                               2.3.2
soundex                            1.0
spf                                1.1.1
stooop                             4.4.1


stringprep                         1.0.1
stringprep::data                   1.0.1
struct                             1.4
struct                             2.1
struct::disjointset                1.0
struct::graph                      1.2.1
struct::graph                      2.4
struct::graph::op                  0.11.3
struct::list                       1.8.2
struct::matrix                     1.2.1
struct::matrix                     2.0.2
struct::pool                       1.2.1
struct::prioqueue                  1.4
struct::queue                      1.4.4
struct::record                     1.2.1
struct::set                        2.2.3
struct::skiplist                   1.3
struct::stack                      1.5.3
struct::tree                       1.2.2
struct::tree                       2.1.2
sum                                1.1.0
switched                           2.2.1
tar                                0.7.1
tcl::chan::cat                     1.0.2
tcl::chan::core                    1
tcl::chan::events                  1
tcl::chan::facade                  1.0.1
tcl::chan::fifo                    1
tcl::chan::fifo2                   1
tcl::chan::halfpipe                1
tcl::chan::memchan                 1.0.2
tcl::chan::null                    1
tcl::chan::nullzero                1
tcl::chan::random                  1
tcl::chan::std                     1.0.1
tcl::chan::string                  1.0.1
tcl::chan::textwindow              1
tcl::chan::variable                1.0.2
tcl::chan::zero                    1
tcl::randomseed                    1
tcl::transform::adler32            1
tcl::transform::base64             1
tcl::transform::core               1
tcl::transform::counter            1
tcl::transform::crc32              1
tcl::transform::hex                1
tcl::transform::identity           1
tcl::transform::limitsize          1
tcl::transform::observe            1
tcl::transform::otp                1
tcl::transform::rot                1
tcl::transform::spacer             1
tcl::transform::zlib               1
tclDES                             1.0.0
tclDESjr                           1.0.0
tepam                              0.4.0

term                               0.1
term::ansi::code                   0.1
term::ansi::code::attr             0.1
term::ansi::code::ctrl             0.1.2
term::ansi::code::macros           0.1
term::ansi::ctrl::unix             0.1.1
term::ansi::send                   0.1
term::interact::menu               0.1
term::interact::pager              0.1
term::receive                      0.1
term::receive::bind                0.1
term::send                         0.1
text::write                        1
textutil                           0.7.1
textutil::adjust                   0.7.1
textutil::expander                 1.3.1
textutil::repeat                   0.7
textutil::split                    0.7
textutil::string                   0.7.1
textutil::tabify                   0.7
textutil::trim                     0.7
tie                                1.1
tie::std::array                    1.0
tie::std::dsource                  1.0
tie::std::file                     1.0.4
tie::std::growfile                 1.0
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
treeql                             1.3.1
try                                1
uevent                             0.3.1
uevent::onidle                     0.1
unicode                            1.0.0
unicode::data                      1.0.0
units                              2.1.1
uri                                1.2.4
uri::urn                           1.0.2
uuencode                           1.1.5
uuid                               1.0.2
valtype::common                    1
valtype::creditcard::amex          1
valtype::creditcard::discover      1
valtype::creditcard::mastercard    1
valtype::creditcard::visa          1
valtype::gs1::ean13                1
valtype::iban                      1.4
valtype::imei                      1
valtype::isbn                      1
valtype::luhn                      1
valtype::luhn5                     1
valtype::usnpi                     1
valtype::verhoeff                  1
websocket                          1.3
wip                                1.2
wip                                2.2
xsxp                               1.0
yaml                               0.3.6
yencode                            1.1.3
zipfile::decode                    0.4
zipfile::encode                    0.3







|









|






<





|
|
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400

401
402
403
404
405
406
407
treeql                             1.3.1
try                                1
uevent                             0.3.1
uevent::onidle                     0.1
unicode                            1.0.0
unicode::data                      1.0.0
units                              2.1.1
uri                                1.2.2
uri::urn                           1.0.2
uuencode                           1.1.5
uuid                               1.0.2
valtype::common                    1
valtype::creditcard::amex          1
valtype::creditcard::discover      1
valtype::creditcard::mastercard    1
valtype::creditcard::visa          1
valtype::gs1::ean13                1
valtype::iban                      1.1
valtype::imei                      1
valtype::isbn                      1
valtype::luhn                      1
valtype::luhn5                     1
valtype::usnpi                     1
valtype::verhoeff                  1

wip                                1.2
wip                                2.2
xsxp                               1.0
yaml                               0.3.6
yencode                            1.1.3
zipfile::decode                    0.2
zipfile::encode                    0.1
Changes to support/releases/history/README-1.16.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Overview
========

    11  new packages                in 7   modules
    45  changed packages            in 26  modules
    288 internally changed packages in 100 modules
    61  unchanged packages          in 11  modules
    411 packages, total             in 114 modules, total

New in tcllib 1.16
==================

    Module      Package                New Version   Comments
    ----------- ---------------------- ------------- ----------




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
Overview
========

    11  new packages                in 7   modules
    44  changed packages            in 26  modules
    288 internally changed packages in 100 modules
    62  unchanged packages          in 11  modules
    411 packages, total             in 114 modules, total

New in tcllib 1.16
==================

    Module      Package                New Version   Comments
    ----------- ---------------------- ------------- ----------
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
================================

                                                            tcllib 1.15   tcllib 1.16
    Module             Package                              Old Version   New Version   Comments
    ------------------ ------------------------------------ ------------- ------------- ----------
    aes                aes                                  1.1           1.1.1         B D T
    coroutine          coroutine::auto                      1.1           1.1.1         B D
    dns                ip                                   1.2           1.2.2         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    doctools           doctools                             1.4.14        1.4.17        B D T
                       doctools::changelog                  1             1.1           D
    ------------------ ------------------------------------ ------------- ------------- ----------
    fileutil           fileutil                             1.14.5        1.14.6        B D T
                       fileutil::decode                     0.1           0.2           B
    ------------------ ------------------------------------ ------------- ------------- ----------







|







32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
================================

                                                            tcllib 1.15   tcllib 1.16
    Module             Package                              Old Version   New Version   Comments
    ------------------ ------------------------------------ ------------- ------------- ----------
    aes                aes                                  1.1           1.1.1         B D T
    coroutine          coroutine::auto                      1.1           1.1.1         B D
    dns                ip                                   1.2           1.2.1         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    doctools           doctools                             1.4.14        1.4.17        B D T
                       doctools::changelog                  1             1.1           D
    ------------------ ------------------------------------ ------------- ------------- ----------
    fileutil           fileutil                             1.14.5        1.14.6        B D T
                       fileutil::decode                     0.1           0.2           B
    ------------------ ------------------------------------ ------------- ------------- ----------
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
                       pt::tclparam::configuration::tcloo   1.0.2         1.0.3         D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    rest               rest                                 1.0           1.0.1         B D
    ------------------ ------------------------------------ ------------- ------------- ----------
    sasl               SASL                                 1.3.2         1.3.3         B D T
                       SASL::NTLM                           1.1.1         1.1.2         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    struct             struct::list                         1.8.2         1.8.3         B D T
                       struct::matrix                       1.2.1         1.2.1         D
                       struct::matrix                       2.0.2         2.0.3         D
                       struct::queue                        1.4.4         1.4.5         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    tar                tar                                  0.7.1         0.9           B D T
    tepam              tepam                                0.4.0         0.5.0         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    term               term::ansi::code                     0.1           0.2           B D







<
|







67
68
69
70
71
72
73

74
75
76
77
78
79
80
81
                       pt::tclparam::configuration::tcloo   1.0.2         1.0.3         D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    rest               rest                                 1.0           1.0.1         B D
    ------------------ ------------------------------------ ------------- ------------- ----------
    sasl               SASL                                 1.3.2         1.3.3         B D T
                       SASL::NTLM                           1.1.1         1.1.2         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------

    struct             struct::matrix                       1.2.1         1.2.1         D
                       struct::matrix                       2.0.2         2.0.3         D
                       struct::queue                        1.4.4         1.4.5         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    tar                tar                                  0.7.1         0.9           B D T
    tepam              tepam                                0.4.0         0.5.0         B D T
    ------------------ ------------------------------------ ------------- ------------- ----------
    term               term::ansi::code                     0.1           0.2           B D
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
    page::reader::ser, page::reader::treeser,
    page::transform::mecpu, page::transform::reachable,
    page::transform::realizable, page::writer::hb,
    page::writer::identity, page::writer::me, page::writer::mecpu,
    page::writer::null, page::writer::peg, page::writer::ser,
    page::writer::tpc, page::writer::tree, paths,
    pt::peg::container::peg, pt::peg::export::container, resolv,
    spf, struct, text::write, tie::std::array, tie::std::dsource,
    tie::std::file, tie::std::growfile, tie::std::log,
    tie::std::rarray, transfer::copy::queue

Legend  Change  Details Comments
        ------  ------- ---------
        Major   API:    ** incompatible ** API changes.

        Minor   EF :    Extended functionality, API.
                I  :    Major rewrite, but no API change







|
|
|







491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
    page::reader::ser, page::reader::treeser,
    page::transform::mecpu, page::transform::reachable,
    page::transform::realizable, page::writer::hb,
    page::writer::identity, page::writer::me, page::writer::mecpu,
    page::writer::null, page::writer::peg, page::writer::ser,
    page::writer::tpc, page::writer::tree, paths,
    pt::peg::container::peg, pt::peg::export::container, resolv,
    spf, struct, struct::list, text::write, tie::std::array,
    tie::std::dsource, tie::std::file, tie::std::growfile,
    tie::std::log, tie::std::rarray, transfer::copy::queue

Legend  Change  Details Comments
        ------  ------- ---------
        Major   API:    ** incompatible ** API changes.

        Minor   EF :    Extended functionality, API.
                I  :    Major rewrite, but no API change