| Ticket UUID: | 1152746 | ||
| Title: | TIP #241 -nocase option for [lsearch], [lsort], and [switch] | ||
| Type: | Patch | Created on: | 2005-02-27 04:53:25 |
| Submitter: | mistachkin | Assigned to: | dkf |
| Subsystem: | 17. Commands I-L | Severity: | |
| Priority: | 5 Medium | Last modified: | 2005-11-15 15:56:32 |
| Status: | Closed | Closed by: | dkf |
| Resolution: | Fixed | Closed on: | 2005-06-01 12:14:56 |
| Version: | TIP Implementation | ||
| Description: | ||||
This provided patch was made against HEAD. It has been tested on Windows NT and FreeBSD. Please refer to TIP #241 for more information. | ||||
| User Comments: | ||||
mistachkin added on 2005-02-27 11:53:26:
File Added - 123296: TIP-241v1.diff mistachkin added on 2005-02-27 15:01:36:
Logged In: YES user_id=113501 Updated v2 patch (optimized). Added docs and test cases. mistachkin added on 2005-02-27 15:01:37:
File Added - 123311: TIP-241v2.diff mistachkin added on 2005-02-28 03:20:55:
File Added - 123374: TIP-241v3.diff Logged In: YES user_id=113501 Updated v3 patch. Added [lsort -nocase] with docs and tests. mistachkin added on 2005-03-02 13:53:52:
Logged In: YES user_id=113501 Updated v4 patch. Added [switch -nocase] with docs and tests. mistachkin added on 2005-03-02 13:53:53:
File Added - 123800: TIP-241v4.diff dkf added on 2005-03-02 16:58:59:
File Deleted - 123374: dkf added on 2005-03-02 16:59:00:
File Deleted - 123311: dkf added on 2005-06-01 19:14:56:
Logged In: YES user_id=79902 Implemented using the patch, thanks! I also added compilation of [switch -glob -nocase]; I'd have done it for -exact -nocase too, but I don't know what opcodes to issue (INST_STR_EQ doesn't take an immediate operand for nocaseness, unlike INST_STR_MATCH) kchansen added on 2005-11-15 01:31:45:
Logged In: YES
user_id=614439
A Tcl-only approach....
I needed a -nocase option for the switch statement, scanned
the tips and found this one. Here is the approach I took to
get effectively the same behavior:
proc CreateCaselessRegExp {Text} {
set TextUpper [split [string toupper $Text] {}]
set TextLower [split [string tolower $Text] {}]
foreach Upper $TextUpper Lower $TextLower {
lappend TextResult "\[$TextUpper$TextLower\]"
}
set RegExp [join $TextResult {}]
return $RegExp
};# CreateCaselessRegExp
With this proc, a "switch" with "-exact" and "-nocase"
replaces those options with "-regexp", and replaces the exact
strings with the result of calling CreateCaselessRegExp. You
must also check to see if the test value is "default" and not
change it when it is encountered.
For example:
switch -exact -nocase -- $MyText {
First {
...
}
Third {
...
}
"Another one here" {
...
}
"Test #9" {
}
default {
}
}
becomes:
switch -regexp -- $MyText {
[Ff][Ii][Rr][Ss][Tt] {
...
}
[Tt][Hh][Ii][Rr][Dd] {
...
}
"[Aa][Nn][Oo][Tt][Hh][Ee][Rr][ ][Oo][Nn][Ee][ ][Hh][Ee][Rr]
[Ee]" {
...
}
"[Tt][Ee][Ss][Tt][ ][##][99]" {
}
default {
}
}
I actually ended up coding as:
eval {switch -exact -nocase -- $MyText {
[CreateCaselessRegExp First] {
...
}
[CreateCaselessRegExp Third] {
...
}
[CreateCaselessRegExp "Another one here"] {
...
}
[CreateCaselessRegExp "Test #9"] {
}
default {
}
}}
As you can see, it could be made a little smarter because all
non-alphabet characters end up doubled. A test could be put
in to not create a "one of list" selections for things which are
not alphabet, but I figured it was fine for a first cut.... I also
liked the fact that I was able to get the case insensitivity with
very little extra effort....
<Karl C. Hansen>
kchansen added on 2005-11-15 01:38:28:
Logged In: YES
user_id=614439
Typo in previous proc....
proc CreateCaselessRegExp {Text} {
set TextUpper [split [string toupper $Text] {}]
set TextLower [split [string tolower $Text] {}]
foreach Upper $TextUpper Lower $TextLower {
lappend TextResult "\[$Upper$Lower\]"
# ^^^^^^^^^^^^^^^^
}
set RegExp [join $TextResult {}]
return $RegExp
};# CreateCaselessRegExp
dkf added on 2005-11-15 15:56:32:
Logged In: YES user_id=79902 If you're going to do that, you should remember to anchor the generated REs. You might (assuming you're not stuck on Tcl 8.0 or before) also like to use the RE: (?i)^FooBar$ instead of: ^[Ff][Oo][Oo][Bb][Aa][Rr]$ if you see what I mean. None of which makes much odds. This is a closed issue. | ||||
Attachments:
- TIP-241v4.diff [download] added by mistachkin on 2005-03-02 13:53:53. [details]
