Overview edit
AMG: TIP 475 [
1] proposes a new [string insert] command to allow inserting substrings into a string at a specified index.
Specification edit
string insert string index insertStringReturns a copy of
string with
insertString inserted at the
index'th character.
index may be specified as described in the
STRING INDICES [
2] section.
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
string. If
index is at or after the end of
string (e.g.,
index is
end),
insertString is appended to
string.
Implementation edit
C implementation available here: [
3]
Also, here it is in
pure-Tcl:
# Pure Tcl implementation of [string insert] command.
proc ::tcl::string::insert {string index insertString} {
# Convert end-relative and TIP 176 indexes to simple integers.
if {[regexp -expanded {
^(end(?![\t\n\v\f\r ]) # "end" is never followed by whitespace
|[\t\n\v\f\r ]*[+-]?\d+) # m, with optional leading whitespace
(?:([+-]) # op, omitted when index is "end"
([+-]?\d+))? # n, omitted when index is "end"
[\t\n\v\f\r ]*$ # optional whitespace (unless "end")
} $index _ m op n]} {
# Convert first index to an integer.
switch $m {
end {set index [string length $string]}
default {scan $m %d index}
}
# Add or subtract second index, if provided.
switch $op {
+ {set index [expr {$index + $n}]}
- {set index [expr {$index - $n}]}
}
} elseif {![string is integer -strict $index]} {
# Reject invalid indexes.
return -code error "bad index \"$index\": must be\
integer?\[+-\]integer? or end?\[+-\]integer?"
}
# Concatenate the pre-insert, insertion, and post-insert strings.
string cat [string range $string 0 [expr {$index - 1}]] $insertString\
[string range $string $index end]
}
# Bind [string insert] to [::tcl::string::insert].
namespace ensemble configure string -map [dict replace\
[namespace ensemble configure string -map]\
insert ::tcl::string::insert]