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