This was WIP, don't know if it stalled...
I see
threeWayCompareTo: aString
�� �� �� �� "Do a three-way comparison between the receiver and anotherObject, returning
�� �� �� �� -1 if self < anotherObject
�� �� �� �� 0 if self = anotherObject
�� �� �� �� 1 if self > anotherObject
�� �� �� �� This assumes a total order in accordance with the mathematical law of trichotomy.
�� �� �� �� See also:�� http://en.wikipedia.org/wiki/Three-way_comparison"
�� �� �� �� ��^ (self compare: self with: aString collated: AsciiOrder) - 2
And I thought that we got a new primitive returning -101 directly
Is it not the case?
Stef
String>>compare: string1 with: string2 collated: order
�� �� �� �� "'abc' = 'abc' asWideString >>> true"
�� �� �� �� "'abc' asWideString = 'abc' >>> true"
�� �� �� �� "(ByteArray with: 97 with: 0 with: 0 with: 0) asString ~= 'a000' asWideString >>> true"
�� �� �� �� "('abc' sameAs: 'aBc' asWideString) >>> true"
�� �� �� �� "('aBc' asWideString sameAs: 'abc') >>> true"
�� �� �� �� "('a000' asWideString ~= (ByteArray with: 97 with: 0 with: 0 with: 0) asString) >>> true"
�� �� �� �� "((ByteArray with: 97 with: 0 with: 0 with: 0) asString sameAs: 'Abcd' asWideString) >>> false"
�� �� �� �� "('a000' asWideString sameAs: (ByteArray with: 97 with: 0 with: 0 with: 0) asString) >>> false"
�� �� �� �� (string1 isByteString and: [string2 isByteString]) ifTrue: [
�� �� �� �� �� �� �� �� ^ ByteString compare: string1 with: string2 collated: order].
�� �� ��"Primitive does not fail properly right now"
�� �� �� �� ^ String compare: string1 with: string2 collated: order
ByteString>>compare: string1 with: string2 collated: order
�� �� �� �� "Return 1, 2 or 3, if string1 is <, =, or > string2, with the collating order of characters given by the order array."
�� �� �� �� | len1 len2 c1 c2 |
�� �� �� �� <primitive: 'primitiveCompareString' module: 'MiscPrimitivePlugin'>
�� �� �� �� <var: #string1 declareC: 'unsigned char *string1'>
�� �� �� �� <var: #string2 declareC: 'unsigned char *string2'>
�� �� �� �� <var: #order declareC: 'unsigned char *order'>
�� �� �� �� len1 := string1 size.
�� �� �� �� len2 := string2 size.
�� �� �� �� 1 to: (len1 min: len2) do:
�� �� �� �� �� �� �� �� [:i |
�� �� �� �� �� �� �� �� c1 := order at: (string1 basicAt: i) + 1.
�� �� �� �� �� �� �� �� c2 := order at: (string2 basicAt: i) + 1.
�� �� �� �� �� �� �� �� c1 = c2 ifFalse:
�� �� �� �� �� �� �� �� �� �� �� �� [c1 < c2 ifTrue: [^ 1] ifFalse: [^ 3]]].
�� �� �� �� len1 = len2 ifTrue: [^ 2].
�� �� �� �� len1 < len2 ifTrue: [^ 1] ifFalse: [^ 3].