CharArray.st
author claus
Thu, 02 Jun 1994 18:22:49 +0200
changeset 88 81dacba7a63a
parent 82 0147b4f725ae
child 92 0c73b48551ac
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     1
"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1994 by Claus Gittinger
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     4
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
af7aeb79b25e Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    11
"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    12
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    13
ByteArray subclass:#AbstractString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    17
       category:'Collections-Text'
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    18
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    19
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    20
AbstractString comment:'
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    21
COPYRIGHT (c) 1994 by Claus Gittinger
82
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    22
              All Rights Reserved
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    23
'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    24
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    25
!AbstractString class methodsFor:'documentation'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    26
82
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    27
copyright
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    28
"
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    29
 COPYRIGHT (c) 1994 by Claus Gittinger
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    30
              All Rights Reserved
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    31
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    32
 This software is furnished under a license and may be used
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    33
 only in accordance with the terms of that license and with the
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    35
 be provided or otherwise made available to, or used by, any
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    36
 other person.  No title to or ownership of the software is
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    37
 hereby transferred.
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    38
"
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    39
!
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    40
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    41
version
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    42
"
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    43
$Header: /cvs/stx/stx/libbasic/Attic/CharArray.st,v 1.4 1994-06-02 11:18:12 claus Exp $
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    44
"
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    45
!
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
    46
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    47
documentation
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    48
"
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
    49
    AbstractString is a superclass for all kinds of Strings (i.e.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
    50
    (singleByte-)Strings, TwoByteStrings and whatever comes in the future.
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    51
"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    52
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    53
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    54
!AbstractString class methodsFor:'instance creation'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    55
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    56
basicNew
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    57
    "return a new empty string"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    58
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    59
    ^ self basicNew:0
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    60
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    61
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    62
new
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    63
    "return a new empty string"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    65
    ^ self basicNew:0
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    66
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    67
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    68
fromString:aString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    69
    "return a copy of the argument, aString"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    70
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
    71
    ^ (self basicNew:(aString size)) replaceFrom:1 with:aString
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
    72
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
    73
    "TwoByteString fromString:'hello'"
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    74
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    75
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    76
!AbstractString methodsFor:'converting'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    77
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    78
asUppercase
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    79
    "return a copy of myself in uppercase letters"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    80
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    81
    |newStr
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    82
     mySize "{ Class: SmallInteger }" |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    83
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    84
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    85
    newStr := self species new:mySize.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    86
    1 to:mySize do:[:i |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    87
        newStr at:i put:(self at:i) asUppercase
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    88
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    89
    ^newStr
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    90
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    91
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    92
asLowercase
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    93
    "return a copy of myself in lowercase letters"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    94
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    95
    |newStr
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    96
     mySize "{ Class: SmallInteger }" |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    97
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    98
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
    99
    newStr := self species new:mySize.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   100
    1 to:mySize do:[:i |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   101
        newStr at:i put:(self at:i) asLowercase
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   102
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   103
    ^newStr
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   104
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   105
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   106
asString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   107
    "return myself - I am a string"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   108
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   109
    ^ self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   110
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   111
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   112
asTwoByteString
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   113
    "return the receiver converted to a two-byte string"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   114
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   115
    ^ TwoByteString fromString:self
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   116
!
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   117
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   118
asSingleByteString
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   119
    "return the receiver converted to a 'normal' string"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   120
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   121
    ^ String fromString:self
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   122
!
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   123
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   124
asText
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   125
    "return a Text-object (collection of lines) from myself.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   126
     BIG warning: Text is totally misnamed here 
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   127
         - ST/X's Text has nothing to do with PP's Text.
82
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   128
         Therefore it will be removed/renamed soon."
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   129
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   130
    ^ Text from:self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   131
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   132
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   133
asNumber
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   134
    "read a number from the receiver"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   135
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   136
    ^ Number readFromString:self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   137
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   138
    "'123' asNumber"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   139
    "'123.567' asNumber"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   140
    "'(5/6)' asNumber"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   141
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   142
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   143
asFilename
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   144
    "return a Filename with pathname taken from the receiver"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   145
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   146
    ^ Filename named:self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   147
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   148
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   149
asCollectionOfWords
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   150
    "return a collection containing the words (separated by whitespace) 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   151
     of the receiver"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   152
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   153
    |words ch
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   154
     start  "{ Class:SmallInteger }" 
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   155
     stop   "{ Class:SmallInteger }" 
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   156
     mySize "{ Class:SmallInteger }"|
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   157
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   158
    words := OrderedCollection new.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   159
    start := 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   160
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   161
    [start <= mySize] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   162
        ch := self at:start.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   163
        ((ch == Character space) or:[ch isSeparator]) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   164
            start := start + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   165
        ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   166
            stop := self indexOfSeparatorStartingAt:start.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   167
            stop == 0 ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   168
                words add:(self copyFrom:start to:mySize).
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   169
                ^ words
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   170
            ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   171
            words add:(self copyFrom:start to:(stop - 1)).
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   172
            start := stop
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   173
        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   174
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   175
    ^ words
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   176
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   177
    "'hello world isnt this nice' asCollectionOfWords'"
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   178
!
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   179
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   180
asCollectionOfLines
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   181
    "return a collection containing the lines (separated by cr) 
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   182
     of the receiver."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   183
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   184
    |lines myClass
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   185
     numberOfLines "{ Class:SmallInteger }"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   186
     startIndex    "{ Class:SmallInteger }"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   187
     stopIndex     "{ Class:SmallInteger }" |
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   188
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   189
    "count first, to avoid regrowing"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   190
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   191
    numberOfLines := (self occurrencesOf:Character cr) + 1.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   192
    lines := OrderedCollection new:numberOfLines.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   193
    myClass := self species.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   194
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   195
    startIndex := 1.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   196
    1 to:numberOfLines do:[:lineNr |
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   197
        stopIndex := self indexOf:(Character cr) startingAt:startIndex.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   198
        stopIndex == 0 ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   199
            stopIndex := self size
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   200
        ] ifFalse: [
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   201
            stopIndex := stopIndex - 1.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   202
        ].
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   203
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   204
        (stopIndex < startIndex) ifTrue: [
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   205
            lines add:(myClass new:0)
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   206
        ] ifFalse: [
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   207
            lines add:(self copyFrom:startIndex to:stopIndex)
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   208
        ].
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   209
        startIndex := stopIndex + 2
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   210
    ].
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   211
    ^ lines
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   212
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   213
    "
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   214
     '1 one\2 two\3 three\4 four\5 five' withCRs asCollectionOfLines
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   215
     '1 one\2 two\3 three\4 four\5 five' withCRs asCollectionOfWords
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   216
    "
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   217
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   218
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   219
!AbstractString methodsFor:'printing & storing'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   220
82
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   221
article
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   222
    "return an article string"
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   223
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   224
    |firstChar|
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   225
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   226
    firstChar := (self at:1) asLowercase. 
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   227
    (firstChar isVowel or:[firstChar == $x]) ifTrue:[
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   228
         ^ 'an'
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   229
    ].
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   230
    ^ 'a'
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   231
!
0147b4f725ae *** empty log message ***
claus
parents: 77
diff changeset
   232
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   233
printOn:aStream
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   234
    "print the receiver on aStream"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   235
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   236
    aStream nextPutAll:self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   237
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   238
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   239
printString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   240
    "return a string for printing - thats myself"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   241
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   242
    ^ self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   243
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   244
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   245
displayString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   246
    "return a string to display the receiver - use storeString to have
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   247
     quotes around"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   248
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   249
    ^ self storeString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   250
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   251
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   252
!AbstractString methodsFor:'comparing'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   253
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   254
hash
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   255
    "return an integer useful as a hash-key"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   256
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   257
%{  /* NOCONTEXT */
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   258
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   259
    REGISTER int g, val;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   260
    REGISTER unsigned char *cp, *cp0;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   261
    int l;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   262
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   263
    cp = _stringVal(self);
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   264
    l = _stringSize(self);
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   265
    if (_qClass(self) != String) {
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   266
        int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   267
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   268
        cp += n;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   269
        l -= n;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   270
    }
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   271
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   272
    /*
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   273
     * this is the dragon-book algorithm with a funny start
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   274
     * value (to give short strings a number above 8192)
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   275
     */
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   276
    val = 12345;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   277
    for (cp0 = cp, cp += l - 1; cp >= cp0; cp--) {
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   278
        val = (val << 5) + (*cp & 0x1F);
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   279
        if (g = (val & 0x3E000000))
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   280
            val ^= g >> 25 /* 23 */ /* 25 */;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   281
        val &= 0x3FFFFFFF;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   282
    }
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   283
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   284
    if (l) {
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   285
        l |= 1; 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   286
        val = (val * l) & 0x3FFFFFFF;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   287
    }
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   288
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   289
    RETURN ( _MKSMALLINT(val) );
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   290
%}
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   291
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   292
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   293
<= something
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   294
    "Compare the receiver with the argument and return true if the
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   295
     receiver is less than or equal to the argument. Otherwise return false."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   296
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   297
    ^ (self > something) not
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   298
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   299
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   300
< something
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   301
    "Compare the receiver with the argument and return true if the
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   302
     receiver is less than the argument. Otherwise return false."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   303
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   304
    ^ (something > self)
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   305
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   306
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   307
>= something
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   308
    "Compare the receiver with the argument and return true if the
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   309
     receiver is greater than or equal to the argument.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   310
     Otherwise return false."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   311
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   312
    ^ (something > self) not
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   313
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   314
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   315
> aString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   316
    "Compare the receiver with the argument and return true if the
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   317
     receiver is greater than the argument. Otherwise return false.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   318
     In contrast to ST-80, case differences are NOT ignored, thus
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   319
     'foo' > 'Foo' will return true. 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   320
     This may change."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   321
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   322
    |mySize otherSize c1 c2|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   323
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   324
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   325
    otherSize := aString size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   326
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   327
    1 to:(mySize min:otherSize) do:[:index |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   328
        c1 := self at:index.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   329
        c2 := aString at:index.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   330
        c1 > c2 ifTrue:[^ true].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   331
        c1 < c2 ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   332
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   333
    ^ mySize > otherSize
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   334
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   335
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   336
= aString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   337
    "Compare the receiver with the argument and return true if the
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   338
     receiver is equal to the argument. Otherwise return false."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   339
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   340
    |mySize otherSize|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   341
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   342
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   343
    otherSize := aString size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   344
    mySize == otherSize ifFalse:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   345
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   346
    1 to:mySize do:[:index |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   347
        (self at:index) = (aString at:index) ifFalse:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   348
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   349
    ^ true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   350
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   351
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   352
sameAs:aString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   353
    "Compare the receiver with the argument like =, but ignore
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   354
     case differences. Return true or false"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   355
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   356
    |mySize otherSize|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   357
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   358
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   359
    otherSize := aString size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   360
    mySize == otherSize ifFalse:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   361
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   362
    1 to:mySize do:[:index |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   363
        (self at:index) asLowercase = (aString at:index) asLowercase ifFalse:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   364
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   365
    ^ true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   366
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   367
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   368
!AbstractString methodsFor:'character searching'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   369
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   370
includesMatchCharacters
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   371
    "return true if the receiver includes any meta characters (i.e. $* or $#) 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   372
     for match operations; false if not"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   373
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   374
    ^ self includesAny:'*#['
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   375
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   376
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   377
indexOfSeparator
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   378
    "return the index of the first whitespace character"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   379
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   380
    ^ self indexOfSeparatorStartingAt:1
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   381
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   382
    "'hello world' indexOfSeparator"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   383
!
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   384
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   385
indexOfSeparatorStartingAt:start
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   386
    "return the index of the next whitespace character"
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   387
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   388
    start to:self size do:[:index |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   389
        (self at:index) isSeparator ifTrue:[^ index]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   390
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   391
    ^ 0
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   392
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   393
    "'hello world' indexOfSeparatorStartingAt:3"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   394
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   395
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   396
!AbstractString methodsFor:'substring searching'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   397
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   398
findString:subString 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   399
    "find a substring. if found, return the index;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   400
     if not found, return 0"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   401
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   402
    ^ self findString:subString startingAt:1 ifAbsent:[0]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   403
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   404
    "'hello world' findString:'llo'"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   405
    "'hello world' findString:'ole'"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   406
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   407
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   408
findString:subString startingAt:index
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   409
    "find a substring, starting at index. if found, return the index;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   410
     if not found, return 0"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   411
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   412
    ^ self findString:subString startingAt:index ifAbsent:[0]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   413
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   414
    "'hello yello' findString:'llo' startingAt:1"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   415
    "'hello yello' findString:'llo' startingAt:5"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   416
    "'hello yello' findString:'llo' startingAt:15"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   417
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   418
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   419
findString:subString startingAt:index ifAbsent:exceptionBlock
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   420
    "find a substring, starting at index. if found, return the index;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   421
     if not found, return the result of evaluating exceptionBlock.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   422
     This is a q&d hack - not very efficient"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   423
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   424
    |firstChar found
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   425
     startIndex "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   426
     subSize    "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   427
     mySize     "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   428
     runIdx     "{ Class: SmallInteger }" |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   429
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   430
    subSize := subString size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   431
    subSize == 0 ifTrue:[^ index]. "empty string matches"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   432
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   433
    firstChar := subString at:1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   434
    startIndex := self indexOf:firstChar startingAt:index.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   435
    [startIndex == 0] whileFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   436
        runIdx := startIndex.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   437
        found := true.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   438
        1 to:subSize do:[:i |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   439
            runIdx > mySize ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   440
                found := false
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   441
            ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   442
                (subString at:i) ~~ (self at:runIdx) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   443
                    found := false
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   444
                ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   445
            ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   446
            runIdx := runIdx + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   447
        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   448
        found ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   449
            ^ startIndex
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   450
        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   451
        startIndex := self indexOf:firstChar startingAt:(startIndex + 1)
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   452
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   453
    ^ exceptionBlock value
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   454
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   455
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   456
!AbstractString methodsFor:'pattern matching'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   457
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   458
from:matchStart to:matchStop match:aString from:start to:stop
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   459
    "helper for match; return true if the characters from start to stop in
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   460
     aString are matching the receivers characters from matchStart to matchStop.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   461
     The receiver may contain meta-match characters $* (to match any string) 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   462
     or $# (to match any character) or [...] (to match from a set of characters)."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   463
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   464
    |matchChar 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   465
     mStart "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   466
     mStop  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   467
     sStart "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   468
     sStop  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   469
     mSize  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   470
     sSize  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   471
     index cont matchLast
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   472
     matchSet c1 c2|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   473
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   474
    mStart := matchStart.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   475
    mStop := matchStop.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   476
    sStart := start.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   477
    sStop := stop.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   478
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   479
    [true] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   480
        mSize := mStop - mStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   481
        sSize := sStop - sStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   482
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   483
        "empty strings match"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   484
        (mSize == 0) ifTrue:[^ (sSize == 0)].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   485
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   486
        matchChar := self at:mStart.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   487
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   488
        (matchChar == $#) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   489
            "testString empty -> no match"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   490
            (sSize == 0) ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   491
            "# matches single character"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   492
            ((sSize == 1) and:[mSize == 1]) ifTrue:[^ true].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   493
            "cut off 1st chars and continue"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   494
            mStart := mStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   495
            sStart := sStart + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   496
        ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   497
            (matchChar == $[) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   498
                "testString empty -> no match"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   499
                (sSize == 0) ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   500
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   501
                matchSet := Set new.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   502
                c1 := nil.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   503
                [matchChar == $]] whileFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   504
                    mStart := mStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   505
                    mSize := mSize - 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   506
                    matchChar := self at:mStart.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   507
                    ((matchChar == $-) and:[c1 notNil]) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   508
                        mStart := mStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   509
                        mSize := mSize - 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   510
                        c2 := self at:mStart.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   511
                        (c1 to:c2) do:[:c | matchSet add:c].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   512
                        c1 := nil
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   513
                    ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   514
                        (matchChar == $]) ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   515
                            matchSet add:matchChar.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   516
                            c1 := matchChar.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   517
                        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   518
                    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   519
                ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   520
                mStart := mStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   521
                mSize := mSize - 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   522
                (matchSet includes:(aString at:sStart)) ifFalse:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   523
                ((sSize == 1) and:[mSize == 0]) ifTrue:[^ true].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   524
                "cut off 1st char and continue"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   525
                sStart := sStart + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   526
            ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   527
                (matchChar == $*) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   528
                    "* matches anything"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   529
                    (mSize == 1) ifTrue:[^ true].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   530
                    "testString empty -> matchString not we have no match"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   531
                    (sSize == 0) ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   532
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   533
                    "try to avoid some of the recursion by checking last
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   534
                     character and continue with shortened strings if possible"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   535
                    cont := false.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   536
                    (mStop >= mStart) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   537
                        matchLast := self at:mStop.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   538
                        (matchLast ~~ $*) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   539
                            (matchLast == $#) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   540
                                cont := true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   541
                            ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   542
                                (matchLast == (aString at:sStop)) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   543
                                    cont := true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   544
                                ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   545
                            ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   546
                        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   547
                    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   548
                    cont ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   549
                        index := sStart.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   550
                        [index <= sStop] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   551
                            (self from:(mStart + 1) to:mStop match:aString 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   552
                                  from:index to:sStop) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   553
                                ^ true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   554
                            ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   555
                            index := index + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   556
                        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   557
                        ^ false
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   558
                    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   559
                    mStop := mStop - 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   560
                    sStop := sStop - 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   561
                ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   562
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   563
                    "testString empty ?"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   564
                    (sSize == 0) ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   565
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   566
                    "first characters equal ?"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   567
                    ((aString at:sStart) ~~ matchChar) ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   568
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   569
                    "avoid recursion if possible"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   570
                    ((sSize == mSize) and:[self = aString]) ifTrue:[^ true].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   571
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   572
                    "cut off 1st chars and continue"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   573
                    mStart := mStart + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   574
                    sStart := sStart + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   575
                ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   576
            ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   577
        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   578
    ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   579
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   580
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   581
match:aString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   582
    "return true if aString matches self, where self may contain meta-match 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   583
     characters $* (to match any string) or $# (to match any character)."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   584
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   585
    ^ self from:1 to:(self size) match:aString from:1 to:(aString size)
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   586
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   587
    " '*ute*' match:'computer' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   588
    " '*uter' match:'computer' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   589
    " 'uter*' match:'computer' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   590
    " '*ute*' match:'' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   591
    " '[abcd]*' match:'computer' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   592
    " '[abcd]*' match:'komputer' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   593
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   594
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   595
!AbstractString methodsFor:'testing'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   596
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   597
isBlank
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   598
    "return true, if the receiver contains spaces only"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   599
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   600
    self do:[:char |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   601
        char ~~ Character space ifTrue:[^ false].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   602
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   603
    ^ true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   604
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   605
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   606
countWords
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   607
    "return the number of words, which are separated by separators"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   608
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   609
    |tally start stop mySize ch|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   610
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   611
    tally := 0.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   612
    start := 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   613
    mySize := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   614
    [start <= mySize] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   615
        ch := self at:start.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   616
        ch isSeparator ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   617
            start := start + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   618
        ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   619
            stop := self indexOfSeparatorStartingAt:start.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   620
            (stop == 0) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   621
                stop := mySize + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   622
            ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   623
            tally := tally + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   624
            start := stop
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   625
        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   626
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   627
    ^ tally
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   628
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   629
    "'hello world isnt this nice' countWords'"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   630
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   631
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   632
nArgsIfSelector
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   633
    "treating the receiver as a message selector, return how many arguments would it take"
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   634
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   635
    |binopChars|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   636
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   637
    (self size > 2) ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   638
        binopChars := '|&-+=*/\<>~@,'.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   639
        (self size == 1) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   640
            ((binopChars occurrencesOf:(self at:1)) == 0) ifTrue:[^ 0].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   641
            ^ 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   642
        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   643
        ((binopChars occurrencesOf:(self at:1)) == 0) ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   644
            ((binopChars occurrencesOf:(self at:2)) == 0) ifFalse:[^ 1]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   645
        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   646
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   647
    ^ self occurrencesOf:$:
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   648
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   649
    "
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   650
     'foo:bar:' nArgsIfSelector
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   651
     #foo:bar: nArgsIfSelector
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   652
     'hello' nArgsIfSelector       
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   653
     '+' nArgsIfSelector   
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   654
    "
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   655
!
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   656
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   657
partsIfSelector
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   658
    "treat the receiver as a message selector, return a collection of parts."
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   659
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   660
    |coll idx1 idx2 sz|
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   661
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   662
    coll := OrderedCollection new.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   663
    idx1 := 1.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   664
    sz := self size.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   665
    [true] whileTrue:[
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   666
        idx2 := self indexOf:$: startingAt:idx1 + 1.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   667
        (idx2 == 0 or:[idx2 == sz]) ifTrue:[
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   668
            coll add:(self copyFrom:idx1).
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   669
            ^ coll
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   670
        ].
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   671
        coll add:(self copyFrom:idx1 to:idx2).
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   672
        idx1 := idx2 + 1
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   673
    ].
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   674
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   675
    "
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   676
     'foo:bar:' partsIfSelector     
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   677
     #foo:bar: partsIfSelector     
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   678
     'hello' partsIfSelector       
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   679
     '+' partsIfSelector           
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   680
    "
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   681
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   682
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   683
levenshteinTo:aString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   684
    "return the levenshtein distance to the argument, aString;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   685
     this value corrensponds to the number of replacements that have to be
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   686
     made to get aString from the receiver.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   687
     see IEEE transactions on Computers 1976 Pg 172 ff."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   688
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   689
    ^ self levenshteinTo:aString s:4 c:1 i:2 d:6
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   690
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   691
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   692
levenshteinTo:aString s:substWeight c:caseWeight i:insrtWeight d:deleteWeight
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   693
    "parametrized levenshtein. arguments are the costs for
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   694
     substitution, case-change, insertion and deletion of a character."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   695
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   696
    |d  "delta matrix"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   697
     len1 len2 dim prevRow row col dimPlus1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   698
     min pp c1 c2|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   699
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   700
    len1 := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   701
    len2 := aString size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   702
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   703
    "create the help-matrix"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   704
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   705
    dim := len1 max:len2.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   706
    dimPlus1 := dim + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   707
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   708
    d := Array new:dimPlus1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   709
    1 to:dimPlus1 do:[:i |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   710
        d at:i put:(Array new:dimPlus1)
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   711
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   712
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   713
    "init help-matrix"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   714
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   715
    (d at:1) at:1 put:0.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   716
    row := d at:1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   717
    1 to:dim do:[:j |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   718
        row at:(j + 1) put:( (row at:j) + insrtWeight )
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   719
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   720
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   721
    1 to:dim do:[:i |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   722
         (d at:(i + 1)) at:1 put:(  ((d at:i) at:1) + deleteWeight )
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   723
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   724
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   725
    1 to:len1 do:[:i |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   726
        c1 := self at:i.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   727
        1 to:len2 do:[:j |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   728
            c2 := aString at:j.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   729
            (c1 == c2) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   730
                pp := 0
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   731
            ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   732
                (c1 asLowercase == c2 asLowercase) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   733
                    pp := caseWeight
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   734
                ] ifFalse:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   735
                    pp := substWeight
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   736
                ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   737
            ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   738
            prevRow := d at:i.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   739
            row := d at:(i + 1).
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   740
            col := j + 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   741
            min := (prevRow at:j) + pp.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   742
            min := min min:( (row at:j) + insrtWeight).
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   743
            min := min min:( (prevRow at:col) + deleteWeight).
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   744
            row at:col put: min
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   745
        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   746
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   747
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   748
    ^ (d at:(len1 + 1)) at:(len2 + 1)
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   749
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   750
    "'ocmprt' levenshteinTo:'computer'
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   751
     'computer' levenshteinTo:'computer'
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   752
     'ocmputer' levenshteinTo:'computer'
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   753
     'cmputer' levenshteinTo:'computer'
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   754
     'Computer' levenshteinTo:'computer'"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   755
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   756
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   757
spellAgainst: aString 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   758
    "return an integer between 0 and 100 indicating how similar 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   759
     the argument is to the receiver.  No case conversion is done."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   760
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   761
    | i1     "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   762
      i2     "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   763
      size1  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   764
      size2  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   765
      score  "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   766
      maxLen "{ Class: SmallInteger }" |
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   767
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   768
    size1 := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   769
    size2 := aString size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   770
    maxLen := size1 max: size2.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   771
    score := 0.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   772
    i1 := i2 := 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   773
    [i1 <= size1 and: [i2 <= size2]] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   774
        (self at: i1) == (aString at: i2) ifTrue: [
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   775
            score := score+1.             
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   776
            i1 := i1+1.                    
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   777
            i2 := i2+1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   778
        ] ifFalse: [
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   779
            (i2 < size2 and: [(self at: i1) == (aString at: i2+1)]) ifTrue: [
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   780
                i2 := i2+1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   781
            ] ifFalse: [
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   782
                (i1 < size1 and: [(self at: i1+1) == (aString at: i2)]) ifTrue: [
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   783
                    i1 := i1+1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   784
                ] ifFalse: [
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   785
                    i1 := i1+1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   786
                    i2 := i2+1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   787
                ] 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   788
            ] 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   789
        ] 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   790
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   791
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   792
    score = maxLen ifTrue: [^100].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   793
    ^100*score//maxLen
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   794
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   795
    " 'Smalltalk' spellAgainst: 'Smalltlak' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   796
    " 'Smalltalk' spellAgainst: 'smalltlak' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   797
    " 'Smalltalk' spellAgainst: 'smalltalk' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   798
    " 'Smalltalk' spellAgainst: 'smalltlk' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   799
    " 'Smalltalk' spellAgainst: 'Smalltolk' "
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   800
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   801
68
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   802
!AbstractString methodsFor:'padded copying'!
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   803
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   804
paddedTo:newSize with:padCharacter
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   805
    "return a new string consisting of the receivers characters,
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   806
     plus pad characters up to length"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   807
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   808
    |s len|
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   809
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   810
    len := self size.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   811
    len < newSize ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   812
        s := self species new:newSize withAll:padCharacter.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   813
        s replaceFrom:1 to:len with:self.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   814
        ^ s
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   815
    ]
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   816
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   817
    "'123' printStringPaddedTo:10 with:$."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   818
    "'123' printStringPaddedTo:10 with:$*"
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   819
    "(Float pi class name , ' ') printStringPaddedTo:15 with:$."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   820
!
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   821
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   822
leftPaddedTo:size with:padCharacter
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   823
    "return a new string of length size, which contains the receiver
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   824
     right-adjusted (i.e. padded on the left).
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   825
     characters on the left are filled with padCharacter.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   826
     If the receivers size is larger than the legth argument, it
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   827
     is returned unchanged."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   828
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   829
    |len s|
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   830
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   831
    len := self size.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   832
    (len < size) ifTrue:[
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   833
        s := self species new:size withAll:padCharacter.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   834
        s replaceFrom:(size - len + 1) with:self.
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   835
        ^ s
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   836
    ]
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   837
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   838
    "'123' leftPaddedTo:10 with:$."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   839
    "'1' leftPaddedTo:10 with:$."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   840
    "'hello' leftPaddedTo:10 with:$."
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   841
! !
59faa75185ba *** empty log message ***
claus
parents: 64
diff changeset
   842
64
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   843
!AbstractString methodsFor:'copying'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   844
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   845
concatenate:string1 and:string2
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   846
    "return the concatenation of myself and the arguments, string1 and string2.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   847
     This is equivalent to self , string1 , string2
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   848
     - generated by compiler when such a construct is detected"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   849
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   850
    ^ self , string1 , string2
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   851
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   852
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   853
concatenate:string1 and:string2 and:string3
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   854
    "return the concatenation of myself and the string arguments.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   855
     This is equivalent to self , string1 , string2 , string3
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   856
     - generated by compiler when such a construct is detected"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   857
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   858
    ^ self , string1 , string2 , string3
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   859
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   860
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   861
!AbstractString methodsFor:'filling and replacing'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   862
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   863
withoutSpaces
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   864
    "return a copy of myself without leading and trailing spaces"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   865
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   866
    |startIndex "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   867
     endIndex   "{ Class: SmallInteger }" 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   868
     sz blank|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   869
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   870
    startIndex := 0.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   871
    sz := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   872
    startIndex == 0 ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   873
        startIndex := 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   874
        endIndex := sz.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   875
        blank := Character space.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   876
        [(startIndex < endIndex) and:[(self at:startIndex) == blank]] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   877
            startIndex := startIndex + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   878
        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   879
        [(endIndex > 1) and:[(self at:endIndex) == blank]] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   880
            endIndex := endIndex - 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   881
        ]
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   882
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   883
    startIndex > endIndex ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   884
        ^ ''
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   885
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   886
    ((startIndex == 1) and:[endIndex == sz]) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   887
        ^ self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   888
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   889
    ^ self copyFrom:startIndex to:endIndex
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   890
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   891
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   892
withoutSeparators
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   893
    "return a copy of myself without leading and trailing whitespace"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   894
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   895
    |startIndex "{ Class: SmallInteger }"
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   896
     endIndex   "{ Class: SmallInteger }" 
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   897
     sz|
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   898
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   899
    startIndex := 0.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   900
    sz := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   901
    startIndex == 0 ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   902
        startIndex := 1.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   903
        endIndex := self size.
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   904
        [(startIndex < endIndex) and:[(self at:startIndex) isSeparator]] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   905
            startIndex := startIndex + 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   906
        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   907
        [(endIndex > 1) and:[(self at:endIndex) isSeparator]] whileTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   908
            endIndex := endIndex - 1
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   909
        ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   910
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   911
    startIndex > endIndex ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   912
        ^ ''
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   913
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   914
    ((startIndex == 1) and:[endIndex == sz]) ifTrue:[
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   915
        ^ self
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   916
    ].
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   917
    ^ self copyFrom:startIndex to:endIndex
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   918
! !
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   919
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   920
!AbstractString methodsFor:'queries'!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   921
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   922
isString
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   923
    "return true, if the receiver is some kind of string;
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   924
     true is returned here - redefinition of Object>>isString."
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   925
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   926
    ^ true
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   927
!
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   928
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   929
encoding
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   930
    ^ #unknown
af7aeb79b25e Initial revision
claus
parents:
diff changeset
   931
! !