Re: Issue 3343 in pharo: StringTest>>testWithoutQuoting and fixes for match: and withoutQuoting

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Re: Issue 3343 in pharo: StringTest>>testWithoutQuoting and fixes for match: and withoutQuoting

pharo
Updates:
        Summary: StringTest>>testWithoutQuoting and fixes for match: and  
withoutQuoting

Comment #2 on issue 3343 by stephane.ducasse:  
StringTest>>testWithoutQuoting and fixes for match: and withoutQuoting
http://code.google.com/p/pharo/issues/detail?id=3343

==================== Summary ====================

Name: Collections-ul.407
Author: ul
Time: 16 November 2010, 6:40:10.433 am
UUID: c66d6765-ca57-cc4c-b08b-0582949ce71a
Ancestors: Collections-ul.406

- fix: http://bugs.squeak.org/view.php?id=6841
- fix: http://bugs.squeak.org/view.php?id=6665

=============== Diff against Collections-ul.406 ===============

Item was changed:
  ----- Method: String>>startingAt:match:startingAt: (in  
category 'comparing') -----
  startingAt: keyStart match: text startingAt: textStart
        "Answer whether text matches the pattern in this string.
        Matching ignores upper/lower case differences.
        Where this string contains #, text may contain any character.
        Where this string contains *, text may contain any sequence of  
characters."
        | anyMatch matchStart matchEnd i matchStr j ii jj |
        i := keyStart.
        j := textStart.

        "Check for any #'s"
        [i > self size ifTrue: [^ j > text size "Empty key matches only  
empty string"].
        (self at: i) = $#] whileTrue:
                ["# consumes one char of key and one char of text"
                j > text size ifTrue: [^ false "no more text"].
                i := i+1.  j := j+1].

        "Then check for *"
        (self at: i) = $*
                ifTrue: [i = self size ifTrue:
                                        [^ true "Terminal * matches all"].
                                "* means next match string can occur  
anywhere"
                                anyMatch := true.
                                matchStart := i + 1]
                ifFalse: ["Otherwise match string must occur immediately"
                                anyMatch := false.
                                matchStart := i].

        "Now determine the match string"
        matchEnd := self size.
        (ii := self indexOf: $* startingAt: matchStart) > 0 ifTrue:
+               [ii = matchStart ifTrue: [self error: '** not valid -- use  
* instead'].
-               [ii = 1 ifTrue: [self error: '** not valid -- use *  
instead'].
                matchEnd := ii-1].
        (ii := self indexOf: $# startingAt: matchStart) > 0 ifTrue:
+               [ii = matchStart ifTrue: [self error: '*# not valid -- use  
#* instead'].
-               [ii = 1 ifTrue: [self error: '*# not valid -- use #*  
instead'].
                matchEnd := matchEnd min: ii-1].
        matchStr := self copyFrom: matchStart to: matchEnd.

        "Now look for the match string"
        [jj := text findString: matchStr startingAt: j caseSensitive: false.
        anyMatch ifTrue: [jj > 0] ifFalse: [jj = j]]
                whileTrue:
                ["Found matchStr at jj.  See if the rest matches..."
                (self startingAt: matchEnd+1 match: text startingAt: jj +  
matchStr size) ifTrue:
                        [^ true "the rest matches -- success"].
                "The rest did not match."
                anyMatch ifFalse: [^ false].
                "Preceded by * -- try for a later match"
                j := j+1].
        ^ false "Failed to find the match string"!

Item was changed:
  ----- Method: String>>withoutQuoting (in category 'internet') -----
  withoutQuoting
        "remove the initial and final quote marks, if present"
        "'''h''' withoutQuoting"
        | quote |
        self size < 2 ifTrue: [ ^self ].
        quote := self first.
+       (quote = self last and: [ quote = $' or: [ quote = $" ] ])
-       (quote = $' or: [ quote = $" ])
                ifTrue: [ ^self copyFrom: 2 to: self size - 1 ]
                ifFalse: [ ^self ].!