You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

747 lines
29 KiB

# -*- tcl -*-
# Maintenance Instruction: leave the 999999.xxx.x as is and use punkshell 'dev make' or bin/punkmake to update from <pkg>-buildversion.txt
# module template: punkshell/src/decktemplates/vendor/punk/modules/template_module-0.0.3.tm
#
# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem.
# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository.
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# (C) 2025
#
# @@ Meta Begin
# Application punk::args::tclcore 999999.0a1.0
# Meta platform tcl
# Meta license MIT
# @@ Meta End
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools
#[manpage_begin punkshell_module_punk::args::tclcore 0 999999.0a1.0]
#[copyright "2025"]
#[titledesc {punk::args definitions for tcl core commands}] [comment {-- Name section and table of contents description --}]
#[moddesc {tcl core argument definitions}] [comment {-- Description at end of page heading --}]
#[require punk::args::tclcore]
#[keywords module]
#[description]
#[para] -
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools
#[section Overview]
#[para] overview of punk::args::tclcore
#[subsection Concepts]
#[para] -
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
## Requirements
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools
#[subsection dependencies]
#[para] packages used by punk::args::tclcore
#[list_begin itemized]
package require Tcl 8.6-
package require punk::args
#*** !doctools
#[item] [package {Tcl 8.6}]
#[item] [package {punk::args}]
#*** !doctools
#[list_end]
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools
#[section API]
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# oo::class namespace
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#tcl::namespace::eval punk::args::tclcore::class {
#*** !doctools
#[subsection {Namespace punk::args::tclcore::class}]
#[para] class definitions
#if {[tcl::info::commands [tcl::namespace::current]::interface_sample1] eq ""} {
#*** !doctools
#[list_begin enumerated]
# oo::class create interface_sample1 {
# #*** !doctools
# #[enum] CLASS [class interface_sample1]
# #[list_begin definitions]
# method test {arg1} {
# #*** !doctools
# #[call class::interface_sample1 [method test] [arg arg1]]
# #[para] test method
# puts "test: $arg1"
# }
# #*** !doctools
# #[list_end] [comment {-- end definitions interface_sample1}]
# }
#*** !doctools
#[list_end] [comment {--- end class enumeration ---}]
#}
#}
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# Base namespace
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
tcl::namespace::eval punk::args::tclcore {
tcl::namespace::export {[a-z]*} ;# Convention: export all lowercase
#variable xyz
#for tcllib - we can potentially parse the doctools to get this info.
#for tcl core commands - the data is stored in man pages - which are not so easy to parse.
#todo - link to man pages
#TODO -
#if we want colour in arg definitions -we need to respect nocolor or change colour to off/ on
#If color included in a definition - it will need to be reloaded when colour toggled(?)
#if {[catch {package require punk::ansi}]} {
# set has_punkansi 0
# set A_WARN ""
# set A_RST ""
#} else {
# set has_punkansi 1
# set A_WARN [a+ red]
# set A_RST "\x1b\[0m"
#}
#we can't just strip ansi as there are non colour codes such as hyperlink that should be maintained whether color is on or off.
#for now we can use reverse - (like underline, is a non-colour attribute that remains effective when color off in punk::ansi)
set A_WARN \x1b\[7m
set A_RST \x1b\[0m
variable manbase_tcl
variable manbase_ext
set patch [info patchlevel]
lassign [split $patch .] major
if {$major < 9} {
set manbase_tcl "https://tcl.tk/man/tcl/TclCmd"
set manbase_ext .htm
} else {
set manbase_tcl "https://tcl.tk/man/tcl9.0/TclCmd"
set manbase_ext .html
}
proc manpage_tcl {cmd} {
variable manbase_tcl
variable manbase_ext
return ${manbase_tcl}/${cmd}${manbase_ext}
}
variable PUNKARGS
# -- --- --- --- --- --- --- --- --- --- --- --- --- ---
# library commands loaded via auto_index
# -- --- --- --- --- --- --- --- --- --- --- --- --- ---
lappend PUNKARGS [list {
*id parray
*proc -name "Builtin: parray" -help\
"Prints on standard output the names and values of all the elements in the
array arrayName, or just the names that match pattern (using the matching
rules of string_match) and their values if pattern is given.
ArrayName must be an array accessible to the caller of parray. It may either
be local or global. The result of this command is the empty string.
(loaded via auto_index)"
*values -min 1 -max 2
arrayName -type string -help\
"variable name of an array"
pattern -type string -optional 1 -help\
"Match pattern possibly containing glob characters"
} "*doc -name Manpage: -url [manpage_tcl library]" ]
# -- --- --- --- --- --- --- --- --- --- --- --- --- ---
lappend PUNKARGS [list {
*id time
*proc -name "Builtin: time" -help\
"Calls the Tcl interpreter count times to evaluate script
(or once if count is not specified). It will then return
a string of the form
503.2 microseconds per iteration
which indicates the average amount of time required per
iteration, in microseconds. Time is measured in elapsed
time, not CPU time.
(see also: timerate)"
*values -min 1 -max 2
script -type script
count -type integer -default 1 -optional 1
} "*doc -name Manpage: -url [manpage_tcl time]" ]
lappend PUNKARGS [list {
*id tcl::namespace::path
*proc -name "Builtin: tcl::namespace::path" -help\
"Returns the command resolution path of the current namespace.
If namespaceList is specified as a list of named namespaces, the current
namespace's command resolution path is set to those namespaces and returns
the empty list. The default command resolution path is always empty.
See the section NAME_RESOLUTION in the manpage for an explanation of the
rules regarding name resolution."
*values -min 0 -max 1
namespaceList -type list -optional 1 -help\
"List of existing namespaces"
} "*doc -name Manpage: -url [manpage_tcl namespace]" ]
lappend PUNKARGS [list {
*id tcl::namespace::unknown
*proc -name "Builtin: tcl::namespace::unknown" -help\
"Sets or returns the unknown command handler for the current namespace.
The handler is invoked when a command called from within the namespace cannot
be found in the current namespace, the namespace's path nor in the global
namespace.
When the handler is invoiked, the full invocation line will be appended to
the script and the result evaluated in the context of the namespace.
The default handler for all namespaces is [a+ italic]::unknown[a].
If no argument is given, it returns the handler for the current namespace."
*values -min 0 -max 1
script -type script -optional 1 -help\
"A well formed list representing a command name and optional arguments."
} "*doc -name Manpage: -url [manpage_tcl namespace]" ]
set I [a+ italic]
set NI [a+ noitalic]
lappend PUNKARGS [list {
*id tcl::process::status
*proc -name "Builtin: tcl::process::status" -help\
"Returns a dictionary mapping subprocess PIDs to their respective status.
if ${$I}pids${$NI} is specified as a list of PIDs then the command
only returns the status of the matching subprocesses if they exist, and
raises an error otherwise.
For active processes, the status is an empty value. For terminated
processes, the status is a list with the following format:
{code ?msg errorCode?}
where:
${$I}code${$NI}
is a standard Tcl return code, ie.,
0 for TCL_OK and 1 for TCL_ERROR,
${$I}msg${$NI}
is the human readable error message,
${$I}errorCode${$NI}
uses the same format as the errorCode global variable
Note that msg and errorCode are only present for abnormally
terminated processes (i.e. those where the code is nonzero).
Under the hood this command calls Tcl_WaitPid with the
WNOHANG flag set for non-blocking behaviour, unless the -wait
switch is set (see below).
"
-wait -type none -optional 1 -help\
"By default the command returns immediately (the underlying Tcl_WaitPid
is called with the WNOHANG flag set) unless this switch is set. if pids
is specified as a list of PIDS then the command waits until the status
of the matching subprocesses are avaliable. If pids was not specified,
this command will wait for all known subprocesses."
-- -type none -optional 1 -help\
"Marks the end of switches. The argument following this one will be
treated as the first arg even if it starts with a -."
*values -min 0 -max 1
pids -type list -optional 1 -help\
"A list of PIDs"
} "*doc -name Manpage: -url [manpage_tcl namespace]" ]
lappend PUNKARGS [list {
*id lappend
*proc -name "builtin: lappend" -help\
"Append list elements onto a variable.
"
*values -min 1 -max -1
varName -type string -help\
"variable name"
value -type any -optional 1 -multiple 1
} "*doc -name Manpage: -url [manpage_tcl lappend]"]
punk::args::definition {
*id ledit
*proc -name "builtin: ledit" -help\
"Replace elements of a list stored in variable
"
*values -min 3 -max -1
listVar -type string -help\
"Existing list variable name"
first -type indexexpression
last -type indexexpression
value -type any -optional 1 -multiple 1
} "*doc -name Manpage: -url [manpage_tcl ledit]"
punk::args::definition {
*id lpop
*proc -name "builtin: lpop" -help\
"Get and remove an element in a list
"
*values -min 1 -max -1
varName -type string -help\
"Existing list variable name"
index -type indexexpression -default end -optional 1 -multiple 1 -help\
"When presented with a single index, the lpop command addresses
the index'th element in it, removes it from the list and returns
the element.
If index is negative or greater or equal than the number of
elements in the list in the variable called varName, an error occurs.
If addition index arguments are supplied, then each argument is used
in turn to address an element within a sublist designated by the
previous indexing operation, allowing the script to remove elements
in sublists, similar to lindex and lset."
} "*doc -name Manpage: -url [manpage_tcl lpop]"
punk::args::definition {
*id lrange
*proc -name "builtin: lrange" -help\
"return one or more adjacent elements from a list.
The new list returned consists of elements first through last, inclusive.
The index values first and last are interpreted the same as index values
for the command 'string index', supporting simple index arithmetic and
indices relative to the end of the list.
e.g lrange {a b c} 0 end-1
"
*values -min 3 -max 3
list -type list -help\
"tcl list as a value"
first -help\
"index expression for first element"
last -help\
"index expression for last element"
} "*doc -name Manpage: -url [manpage_tcl lrange]"
punk::args::definition {
*id tcl::string::cat
*proc -name "builtin: tcl::string::cat" -help\
"Concatente the given strings just like placing them directly next to each other and
return the resulting compound string. If no strings are present, the result is an
empty string.
This primitive is occasionally handier than juxtaposition of strings when mixed quoting
is wanted, or when the aim is to return the result of a concatentation without resorting
to return -level 0, and is more efficient than building a list of arguments and using
join with an empty join string."
*values -min 0 -max -1
string -type string -optional 1 -multiple 1
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::compare
*proc -name "builtin: tcl::string::compare" -help\
"Perform a character-by-character comparison of strings string1 and string2.
Returns -1, 0, or 1, dpending on whether string1 is lexicographically
lessthan, equal to, or greater than string2"
-nocase -type none -help\
"If -nocase is specified, then the strings are compared in a case insensitive manner."
-length -type integer -help\
"If -length is specified, then only the first length characters are used in the comparison.
If -length is negative, it is ignored."
*values -min 2 -max 2
string1 -type string
string2 -type string
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::equal
*proc -name "builtin: tcl::string::equal" -help\
"Perform a character-by-character comparison of strings string1 and string2.
Returns 1 if string1 and string2 are identical, or 0 when not."
-nocase -type none -help\
"If -nocase is specified, then the strings are compared in a case insensitive manner."
-length -type integer -help\
"If -length is specified, then only the first length characters are used in the comparison.
If -length is negative, it is ignored."
*values -min 2 -max 2
string1 -type string
string2 -type string
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::first
*proc -name "builtin: tcl::string::first" -help\
"Search haystackString for a sequence of characters that exactly match the characters
in needleString. If found, return the index of the first character in the first such
match within haystackString. If there is no match, then return -1. If startIndex is
specified (in any of the forms described in STRING_INDICES), then the search is
constrained to start with the character in haystackString specified by the index.
"
*values -min 2 -max 3
needleString -type string
haystackString -type string
startIndex -type indexexpression -optional 1 -help\
"integer or simple expression."
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::insert
*proc -name "builtin: tcl::string::insert" -help\
"Returns a copy of string with insertString inserted at the index'th character.
If index is start-relative, the first character inserted in the returned string will be
at the specified index.
If index is end-relative, the last character inserted in the returned string will be
at the specified index.
if index is at or before the start of string (e.g., index is 0), insertString is
prepended to the string.
If index is at or after the end of the string (e.g., index is end), insertString is
appended to string."
*values -min 3 -max 3
string -type string
index -type indexexpression -help\
"The index may be specified as described in the STRING_INDICES section"
insertString -type string
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::last
*proc -name "builtin: tcl::string::last" -help\
"Search haystackString for a sequence of characters that exactly match the characters
in needleString. If found, return the index of the first character in the last such
match within haystackString. If there is no match, then return -1. If lastIndex is
specified (in any of the forms described in STRING_INDICES), then only the characters
in haystackString at or before the specified lastIndex will be considered by the search
"
*values -min 2 -max 3
needleString -type string
haystackString -type string
lastIndex -type indexexpression -optional 1 -help\
"integer or simple expression."
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::repeat
*proc -name "builtin: tcl::string::repeat" -help\
"Returns a string consisting of string concatenated with itself count times."
*values -min 2 -max 2
string -type string
count -type int -help\
"If count is 0, the empty string will be returned."
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::replace
*proc -name "builtin: tcl::string::replace" -help\
"Removes a range of consecutive characters from string, starting with the character whose
index is first and ending with the character whose index is last
(Using the forms described in STRING_INDICES). An index of 0 refers to the first
character of the string. First and last may be specified as for the index method.
If first is less than zero then it is treated as if it were zero, and if last is
greater than or equal to the length of the string then it is treated as if it were
end. The initial string is returned untouched, if first is greater than last, or if
first is equal to or greater than the length of the inital string, or last is less
than 0."
*values -min 3 -max 3
string -type string
first -type indexexpression
last -type indexexpression
newstring -type string -optional 1 -help\
"If newstring is specified, then it is placed in the removed character range."
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::totitle
*proc -name "builtin: tcl::string::totitle" -help\
"Returns a value equal to string except that the first character in string is converted to
it's Unicode title case variant (or upper case if there is no title case variant) and the
rest of the string is converted to lower case."
*values -min 1 -max 1
string -type string
first -type indexexpression -optional 1 -help\
"If first is specified, it refers to the first char index in the string to start modifying."
last -type indexexpression -optional 1 -help\
"If last is specified, it refers to the char index in the string to stop at (inclusive)."
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::wordend
*proc -name "builtin: tcl::string::wordend" -help\
"Returns the index of the character just after the last one in the word containing
character charIndex of string.
A word is considered to be any contiguous range of alphanumeric (Unicode letters or decimal digits)
or underscore (Unicode connector punctuation) characters, or any single character other than these."
*values -min 2 -max 2
string -type string
charIndex -type indexexpression -help\
"integer or simple expresssion.
e.g end
e.g end-1
e.g M+N"
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition {
*id tcl::string::wordstart
*proc -name "builtin: tcl::string::wordstart" -help\
"Returns the index of the first character in the word containing
character charIndex of string.
A word is considered to be any contiguous range of alphanumeric (Unicode letters or decimal digits)
or underscore (Unicode connector punctuation) characters, or any single character other than these.
"
*values -min 2 -max 2
string -type string
charIndex -type indexexpression -help\
"integer or simple expresssion.
e.g end
e.g end-1
e.g M+N"
} "*doc -name Manpage: -url [manpage_tcl string]"
punk::args::definition [punk::lib::tstr -return string {
*id tcl::string::is
*proc -name "builtin: tcl::string::is" -help\
"Returns 1 if string is a valid member of the specified character class, otherwise returns 0.
"
*leaders -min 1 -max 1
class -type string\
-choices {
alnum
alpha
ascii
boolean
control
dict
digit
double
entier
false
graph
integer
list
lower
print
punct
space
true
upper
wideinteger
wordchar
xdigit
}\
-choicelabels {
alnum\
" Any Unicode alphabet
or digit character"
alpha\
" Any Unicode alphabet
character"
ascii\
" Any character with
a value less than \\u0080
(those that are in the
7-bit ascii range)"
boolean\
" Any of the forms allowed
to Tcl_GetBoolean"
control\
" Any Unicode control char"
dict\
" Any proper dict structure,
with optional surrounding
whitespace. In case of
improper dict structure, 0
is returned and the varname
will contain the index of
the \"element\" where the
dict parsing fails or -1 if
this cannot be determined."
digit\
" Any Unicode digit char.
Note that this includes
chars outside of the \[0-9\]
range."
double\
" Any of the forms allowed
to Tcl_GetDoubleFromObj.
${$A_WARN}With optional surrounding${$A_RST}
${$A_WARN}whitespace.${$A_RST}"
entier\
" Synonym for integer"
false\
" Any of the forms allowed
to Tcl_GetBoolean where the
value is false"
graph\
" Any Unicode printing char
except space."
integer\
" Any of the valid string
formats for an integer value
of arbitrary size in Tcl,
${$A_WARN}with optional surrounding${$A_RST}
${$A_WARN}whitespace${$A_RST}. The formats
accepted are exactly those
accepted by the C routine
Tcl_GetBignumFromObj."
list\
" Any proper list structure,
with optional surrounding
whitespace. In case of
improper list structure, 0
is returned and the varname
will contain the index of
the \"element\" where list
parsing fails, or -1 if
this cannot be determined"
lower\
" Any Unicode lower case
alphabet character"
print\
" Any Unicode printing
character, including space"
punct\
" Any Unicode punctuation
character."
space\
" Any Unicode whitespace
character, mongolian vowel
separator (U+180e),
zero width space (U+200b),
word joiner (U+2060) or
zero width no-break space
(U+feff) (=BOM)"
true\
" Any of the forms allowed
to Tcl_GetBoolean where the
value is true"
upper\
" Any upper case alphabet
character in the Unicode
character set"
wideinteger\
" Any of the valid forms
for a wide integer in Tcl,
${$A_WARN}with optional surrounding${$A_RST}
${$A_WARN}whitespace${$A_RST}. In case of
overflow in the value, 0 is
returned and the varname
will contain -1."
wordchar\
" Any Unicode word char.
That is any alphanumeric
character, and any
Unicode connector
punctuation characters
(e.g. underscore)"
xdigit\
" Any hexadecimal digit
character, and any Unicode
connector punctuation
characters (e.g. underscore)"
}\
-help\
"character class
In the case of boolean, true and false, if the function will return 0, then the
varname will always be set to 0, due to the varied nature of a valid boolean value"
-strict -type none -help\
"If -strictis specified, then an empty string returns 0,
otherwise an empty string will return 1 on any class"
-failindex -type variablename -help\
"If -failindex is specified, then if the function returns 0,
the index in the string where the class was no longer valid will be stored
in the variable named."
*values -min 1 -max 1
string -type string -optional 0
}] "*doc -name Manpage: -url [manpage_tcl string]"
#*** !doctools
#[subsection {Namespace punk::args::tclcore}]
#[para] Core API functions for punk::args::tclcore
#[list_begin definitions]
#proc sample1 {p1 n args} {
# #*** !doctools
# #[call [fun sample1] [arg p1] [arg n] [opt {option value...}]]
# #[para]Description of sample1
# #[para] Arguments:
# # [list_begin arguments]
# # [arg_def tring p1] A description of string argument p1.
# # [arg_def integer n] A description of integer argument n.
# # [list_end]
# return "ok"
#}
#*** !doctools
#[list_end] [comment {--- end definitions namespace punk::args::tclcore ---}]
}
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# Secondary API namespace
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
tcl::namespace::eval punk::args::tclcore::lib {
tcl::namespace::export {[a-z]*} ;# Convention: export all lowercase
tcl::namespace::path [tcl::namespace::parent]
#*** !doctools
#[subsection {Namespace punk::args::tclcore::lib}]
#[para] Secondary functions that are part of the API
#[list_begin definitions]
#proc utility1 {p1 args} {
# #*** !doctools
# #[call lib::[fun utility1] [arg p1] [opt {?option value...?}]]
# #[para]Description of utility1
# return 1
#}
#*** !doctools
#[list_end] [comment {--- end definitions namespace punk::args::tclcore::lib ---}]
}
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools
#[section Internal]
#tcl::namespace::eval punk::args::tclcore::system {
#*** !doctools
#[subsection {Namespace punk::args::tclcore::system}]
#[para] Internal functions that are not part of the API
#}
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
if {![info exists ::punk::args::register::NAMESPACES]} {
namespace eval ::punk::args::register {
set ::punk::args::register::NAMESPACES [list] ;#use fully qualified so 8.6 doesn't find existing var in global namespace
}
}
lappend ::punk::args::register::NAMESPACES ::punk::args::tclcore
## Ready
package provide punk::args::tclcore [tcl::namespace::eval punk::args::tclcore {
variable pkg punk::args::tclcore
variable version
set version 999999.0a1.0
}]
return
#*** !doctools
#[manpage_end]