| # util-string.tcl -- | |
| # | |
| # This file implements package ::Utility::string, which ... | |
| # | |
| # Copyright (c) 1997 Jeffrey Hobbs | |
| # | |
| # See the file "license.terms" for information on usage and | |
| # redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. | |
| # | |
| # | |
| #package require NAME VERSION | |
| package provide ::Utility::string 1.0; # SET VERSION | |
| namespace eval ::Utility::string {; | |
| namespace export -clear * | |
| # string_cap -- | |
| # | |
| # Capitalize a string, or one char in it | |
| # | |
| # Arguments: | |
| # str input string | |
| # idx idx to capitalize | |
| # Results: | |
| # Returns string with specified capitalization | |
| # | |
| proc string_cap {str {idx -1}} { | |
| if {$i>-1} { | |
| if {[string length $str]>$i} { | |
| return $str | |
| } else { | |
| } | |
| } else { | |
| return [string toupper [string index $str 0]][string tolower \ | |
| [string range $str 1 end]] | |
| } | |
| } | |
| # string_reverse -- | |
| # reverses input string | |
| # Arguments: | |
| # s input string to reverse | |
| # Returns: | |
| # string with chars reversed | |
| # | |
| ;proc string_reverse s { | |
| if {[set i [string len $s]]} { | |
| while {$i} {append r [string index $s [incr i -1]]} | |
| return $r | |
| } | |
| } | |
| # obfuscate -- | |
| # If I describe it, it ruins it... | |
| # Arguments: | |
| # s input string | |
| # Returns: | |
| # output | |
| # | |
| ;proc obfuscate s { | |
| if {[set len [string len $s]]} { | |
| set i -1 | |
| while {[incr i]<$len} { | |
| set c [string index $s $i] | |
| if {[regexp "\[\]\\\[ \{\}\t\n\"\]" $c]} { | |
| append r $c | |
| } else { | |
| scan $c %c c | |
| append r \\[format %0.3o $c] | |
| } | |
| } | |
| return $r | |
| } | |
| } | |
| # untabify -- | |
| # removes tabs from a string, replacing with appropriate number of spaces | |
| # Arguments: | |
| # str input string | |
| # tablen tab length, defaults to 8 | |
| # Returns: | |
| # string sans tabs | |
| # | |
| ;proc untabify {str {tablen 8}} { | |
| set out {} | |
| while {[set i [string first "\t" $str]] != -1} { | |
| set j [expr {$tablen-($i%$tablen)}] | |
| append out [string range $str 0 [incr i -1]][format %*s $j { }] | |
| set str [string range $str [incr i 2] end] | |
| } | |
| return $out$str | |
| } | |
| # tabify -- | |
| # converts excess spaces to tab chars | |
| # Arguments: | |
| # str input string | |
| # tablen tab length, defaults to 8 | |
| # Returns: | |
| # string with tabs replacing excess space where appropriate | |
| # | |
| ;proc tabify {str {tablen 8}} { | |
| ## We must first untabify so that \t is not interpreted to be one char | |
| set str [untabify $str] | |
| set out {} | |
| while {[set i [string first { } $str]] != -1} { | |
| ## Align i to the upper tablen boundary | |
| set i [expr {$i+$tablen-($i%$tablen)-1}] | |
| set s [string range $str 0 $i] | |
| if {[string match {* } $s]} { | |
| append out [string trimright $s { }]\t | |
| } else { | |
| append out $s | |
| } | |
| set str [string range $str [incr i] end] | |
| } | |
| return $out$str | |
| } | |
| # wrap_lines -- | |
| # wraps text to a specific max line length | |
| # Arguments: | |
| # txt input text | |
| # len desired max line length+1, defaults to 75 | |
| # P paragraph boundary chars, defaults to \n\n | |
| # P2 substitute for $P while processing, defaults to \254 | |
| # this char must not be in the input text | |
| # Returns: | |
| # text with lines no longer than $len, except where a single word | |
| # is longer than $len chars. does not preserve paragraph boundaries. | |
| # | |
| ;proc wrap_lines "txt {len 75} {P \n\n} {P2 \254}" { | |
| regsub -all $P $txt $P2 txt | |
| regsub -all "\n" $txt { } txt | |
| incr len -1 | |
| set out {} | |
| while {[string len $txt]>$len} { | |
| set i [string last { } [string range $txt 0 $len]] | |
| if {$i == -1 && [set i [string first { } $txt]] == -1} break | |
| append out [string trim [string range $txt 0 [incr i -1]]]\n | |
| set txt [string range $txt [incr i 2] end] | |
| } | |
| regsub -all $P2 $out$txt $P txt | |
| return $txt | |
| } | |
| }; # end of namespace ::Utility::string |