String.st
author claus
Sat, 05 Feb 1994 13:27:58 +0100
changeset 51 9b7ae5e18f3e
parent 42 e33491f6f260
child 53 77ed1ef5c018
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
ByteArray subclass:#String
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Collections-Text'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
String comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
             All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
    25
$Header: /cvs/stx/stx/libbasic/String.st,v 1.10 1994-02-05 12:27:25 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
#include <stdio.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
#include <ctype.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
!String class methodsFor:'documentation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
documentation
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
Strings are ByteArrays storing Characters.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
Strings are kind of kludgy: to allow for easy handling by c-functions,
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
there is always one 0-byte added at the end, which is not counted
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
in size. also, the at:put: method does not allow for storing 0-bytes.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
(to do this, the basicAt:put: and basicNew: methods are redefined)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
You cannot add any instvars to String, since the code (also in the run time
2
claus
parents: 1
diff changeset
    45
system & compiler) knows that strings have no named instvars. 
claus
parents: 1
diff changeset
    46
If you really need strings with instVars, you have to create a subclass 
claus
parents: 1
diff changeset
    47
of String (the access functions defined here can handle this).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    51
!String class methodsFor:'queries'!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    52
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    53
isBuiltInClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    54
    "this class is known by the run-time-system"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    55
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    56
    ^ self == String
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    57
! !
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    58
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
!String class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
    "return a new empty string with anInteger characters"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
    OBJ newString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
    REGISTER int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
    REGISTER OBJ *op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
    int nInstVars, instsize;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
    extern OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
    if (_isSmallInteger(anInteger)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
        len = _intVal(anInteger);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
        if (len >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
            nInstVars = _intVal(_ClassInstPtr(self)->c_ninstvars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
            instsize = OHDR_SIZE + (nInstVars * sizeof(OBJ)) + len + 1;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    78
            PROTECT_CONTEXT
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
            _qNew(newString, instsize, SENDER);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    80
            UNPROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    81
            if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    82
                _InstPtr(newString)->o_class = self;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    84
                if (nInstVars) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
#if defined(memset4)
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    86
                    memset4(_InstPtr(newString)->i_instvars, nil, nInstVars);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
# if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    89
                    /*
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    90
                     * knowing that nil is 0
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    91
                     */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    92
                    memset(_InstPtr(newString)->i_instvars, 0, instsize - OHDR_SIZE);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
# else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    94
                    op = _InstPtr(newString)->i_instvars;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    95
                    do {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    96
                        *op++ = nil;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    97
                    } while (--nInstVars);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   100
                    cp = _stringVal(newString) + (nInstVars * sizeof(OBJ));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   101
                } else
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   102
                    cp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
#ifdef FAST_MEMSET
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   105
                memset(cp, ' ', len);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   106
                *(cp + len) = '\0';
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
#else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   108
                while (len--)
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   109
                    *cp++ = ' ';
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   110
                *cp = '\0';
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   112
                RETURN (newString);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   113
            }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
    ^ (super basicNew:anInteger) atAllPut:(Character space)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
basicNew
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
    "return a new empty string"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
    ^ self basicNew:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
    "return a new empty string"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    ^ self basicNew:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
unititializedNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
    "redefine it back - strings must have a 0-byte at the end"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
fromString:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    "return a copy of the argument, aString"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    ^ aString copyFrom:1 to:(aString size)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
!String methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
basicSize
2
claus
parents: 1
diff changeset
   148
    "return the number of characters in myself.
claus
parents: 1
diff changeset
   149
     Redefined here to exclude the 0-byte at the end."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
    if ((_qClass(self) == String) || (_qClass(self) == Symbol)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
        RETURN ( _MKSMALLINT(_stringSize(self)) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
    ^ super basicSize - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
basicAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
    "return the character at position index, an Integer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
     - reimplemented here since we return characters"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
    REGISTER int indx;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    if (_isSmallInteger(index)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
        indx = _intVal(index);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
        if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
            indx += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
        len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
        if ((indx > 0) && (indx <= len)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
            RETURN ( _MKCHARACTER(_stringVal(self)[indx-1] & 0xFF) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
.
2
claus
parents: 1
diff changeset
   181
    self subscriptBoundsError
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
basicAt:index put:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
    "store the argument, aCharacter at position index, an Integer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
     - reimplemented here since we store characters"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
    REGISTER int value, indx;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
    int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    if (_isCharacter(aCharacter)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
        value = _intVal(_characterVal(aCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
        if (value && _isSmallInteger(index)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
            indx = _intVal(index);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
            if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
                indx += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
            len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
            if ((indx > 0) && (indx <= len)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
                _stringVal(self)[indx-1] = value;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
                RETURN ( aCharacter );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    (aCharacter isMemberOf:Character) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
        self elementNotCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    ] ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
        (aCharacter asciiValue == 0) ifTrue:[
2
claus
parents: 1
diff changeset
   212
            self elementBoundsError
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
        ] ifFalse:[
2
claus
parents: 1
diff changeset
   214
            self subscriptBoundsError
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
!String methodsFor:'converting'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
asUppercase
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    "return a copy of myself in uppercase letters"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
    |newStr
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
     mySize "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
    newStr := self species new:mySize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
    1 to:mySize do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
        newStr at:i put:(self at:i) asUppercase
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
    ^newStr
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
asLowercase
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
    "return a copy of myself in lowercase letters"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
    |newStr
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
     mySize "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
    newStr := self species new:mySize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    1 to:mySize do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
        newStr at:i put:(self at:i) asLowercase
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
    ^newStr
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
asString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    "return myself - I am a string"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
asSymbol
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
    "return a unique symbol with name taken from myself.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
     The argument must be a String, subclass instances are not allowed."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
    if (_qClass(self) == String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
        RETURN ( _MKSYMBOL(_stringVal(self), (OBJ *)0, __context) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
asText
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
    "return a Text-object (collection of lines) from myself"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
    ^ Text from:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
asNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
    "read a number from the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
    ^ Number readFromString:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
    "'123' asNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
    "'123.567' asNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
    "'(5/6)' asNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
asFilename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    "return a Filename with pathname taken from the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
    ^ Filename named:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
2
claus
parents: 1
diff changeset
   289
!String class methodsFor:'binary storage'!
claus
parents: 1
diff changeset
   290
claus
parents: 1
diff changeset
   291
binaryDefinitionFrom: stream manager: manager
claus
parents: 1
diff changeset
   292
    ^ (stream next: (stream nextNumber: 4)) asString
claus
parents: 1
diff changeset
   293
! !
claus
parents: 1
diff changeset
   294
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
!String methodsFor:'printing & storing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   297
isLiteral
41
a14247b04d03 *** empty log message ***
claus
parents: 32
diff changeset
   298
    "return true, if the receiver can be used as a literal
a14247b04d03 *** empty log message ***
claus
parents: 32
diff changeset
   299
     (i.e. can be used in constant arrays)"
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   300
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   301
    ^ true
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   302
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   303
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
printOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    "print the receiver on aStream"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
    aStream nextPutAll:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
printString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
    "return a string for printing - thats myself"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
print
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
    "print the receiver on standard output - for debugging only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
    if (_qClass(self) == String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
        printf("%s", _stringVal(self));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
        RETURN (self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
    super print
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
printfPrintString:formatString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
    "non-portable but sometimes useful.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   332
     Return a printed representation of the receiver as specified by formatString, 
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   333
     which is defined by printf.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   334
     No checking on overrunning the buffer."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   336
%{  /* STACK: 1000 */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   338
    char buffer[800];
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
    char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
    if (_isString(formatString)) {
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   342
        /*
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   343
         * actually only needed on sparc: since thisContext is
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   344
         * in a global register, which gets destroyed by printf,
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   345
         * manually save it here - very stupid ...
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   346
         */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
        OBJ sav = __thisContext;
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   348
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
        cp = (char *)_stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
        if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
            cp += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
        sprintf(buffer, (char *)_stringVal(formatString), cp);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
        __thisContext = sav;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
        RETURN ( _MKSTRING(buffer COMMA_SND) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
    "'hello' printfPrintString:'%%s -> %s'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
    "'hello' printfPrintString:'%%10s -> %10s'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
    "'hello' printfPrintString:'%%-10s -> %-10s'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
displayString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
    "return a string to display the receiver - use storeString to have
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
     quotes around"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
    ^ self storeString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
storeString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    "return a String for storing myself"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   376
    |s n index|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   378
    n := self occurrencesOf:$'.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   379
    n == 0 ifFalse:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   380
	s := String new:(n + 2 + self size).
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   381
        s at:1 put:''''.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   382
	index := 2.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
        self do:[:thisChar |
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   384
            (thisChar == $') ifTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   385
		s at:index put:thisChar.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   386
		index := index + 1.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   387
	    ].
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   388
	    s at:index put:thisChar.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   389
	    index := index + 1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
        ].
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
   391
        s at:index put:''''.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
        ^ s
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
    ^ '''' asString , self , '''' asString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
storeOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
    "put the storeString of myself on aStream"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    aStream nextPut: $'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
    (self includes:$') ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
        self do:[:thisChar |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
            (thisChar == $') ifTrue:[aStream nextPut:thisChar].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
            aStream nextPut:thisChar
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
        aStream nextPutAll:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
    aStream nextPut:$'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
!String methodsFor:'comparing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
hash
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
    "return an integer useful as a hash-key"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
    REGISTER int g, val;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
    REGISTER unsigned char *cp, *cp0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
    int l;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
    cp = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    l = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
    if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
        int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
        cp += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
        l -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
    /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
     * this is the dragon-book algorithm with a funny start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
     * value (to give short strings a number above 8192)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
    val = 12345;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    for (cp0 = cp, cp += l - 1; cp >= cp0; cp--) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
        val = (val << 5) + (*cp & 0x1F);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
        if (g = (val & 0x3E000000))
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
            val ^= g >> 25 /* 23 */ /* 25 */;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
        val &= 0x3FFFFFFF;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    if (l) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
        l |= 1; 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
        val = (val * l) & 0x3FFFFFFF;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
    RETURN ( _MKSMALLINT(val) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
<= something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
    "Compare the receiver with the argument and return true if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
     receiver is less than or equal to the argument. Otherwise return false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
    ^ (self > something) not
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
< something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
    "Compare the receiver with the argument and return true if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
     receiver is less than the argument. Otherwise return false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
    ^ (something > self)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
>= something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
    "Compare the receiver with the argument and return true if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
     receiver is greater than or equal to the argument.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
     Otherwise return false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
    ^ (something > self) not
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
> aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
    "Compare the receiver with the argument and return true if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
     receiver is greater than the argument. Otherwise return false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
    int len1, len2, cmp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
    REGISTER OBJ s = aString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
    char *cp1, *cp2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
    if (_isNonNilObject(s)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
     && ((_qClass(s) == String) || (_qClass(s) == Symbol) || (_qClass(s) == _qClass(self)))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
        cp1 = (char *) _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
        len1 = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
        if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
            int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
            cp1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
            len1 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
        cp2 = (char *) _stringVal(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
        len2 = _stringSize(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
        if (_qClass(s) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
            int n = _intVal(_ClassInstPtr(_qClass(s))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
            cp2 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
            len2 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
        if (len1 <= len2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
            cmp = strncmp(cp1, cp2, len1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
        else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
            cmp = strncmp(cp1, cp2, len2);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
        if (cmp > 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
        if ((cmp == 0) && (len1 > len2)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
    ^ super > aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
= aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
    "Compare the receiver with the argument and return true if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
     receiver is equal to the argument. Otherwise return false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
    int l1, l2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    REGISTER OBJ s = aString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
    char *cp1, *cp2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
    if (s == self) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
        RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
    if (! _isNonNilObject(s)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
    if ((_qClass(s) == String) || (_qClass(s) == Symbol) || (_qClass(s) == _qClass(self))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
        cp1 = (char *) _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
        l1 = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
        if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
            int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
            cp1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
            l1 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
        cp2 = (char *) _stringVal(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
        l2 = _stringSize(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
        if (_qClass(s) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
            int n = _intVal(_ClassInstPtr(_qClass(s))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
            cp2 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
            l2 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
        if (l1 != l2) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
            RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
        RETURN ( (strncmp(cp1, cp2, l1) == 0) ? true : false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
    ^ super = aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
~= aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
    "Compare the receiver with the argument and return true if the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
     receiver is not equal to the argument. Otherwise return false."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
    int l1, l2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
    REGISTER OBJ s = aString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
    char *cp1, *cp2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
    if (s == self) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
    if (! _isNonNilObject(s)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
        RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
    if ((_qClass(s) == String) || (_qClass(s) == Symbol) || (_qClass(s) == _qClass(self))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
        cp1 = (char *) _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
        l1 = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
        if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
            int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
            cp1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
            l1 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
        cp2 = (char *) _stringVal(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
        l2 = _stringSize(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
        if (_qClass(s) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
            int n = _intVal(_ClassInstPtr(_qClass(s))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
            cp2 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
            l2 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
        if (l1 != l2) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
        RETURN ( (strncmp(cp1, cp2, l1) == 0) ? false : true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
    ^ super ~= aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
!String methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
occurrencesOf:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
    "count the occurrences of the argument, aCharacter in myself
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
      - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
    REGISTER int byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
    REGISTER int count;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
    if (_isCharacter(aCharacter)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
        count = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
        byteValue = _intVal(_characterVal(aCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
        cp = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
        if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
            cp += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
        while (*cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
            if (*cp++ == byteValue) count++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
        RETURN ( _MKSMALLINT(count) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
    ^ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
includes:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
    "return true if the argument, aCharacter is included in the receiver
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
    REGISTER int byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
    extern char *strchr();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
    if (_isCharacter(aCharacter)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
        byteValue = _intVal(_characterVal(aCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
        cp = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
        if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
            cp += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
#ifdef FAST_STRCHR
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
        cp = (unsigned char *) strchr(cp, _intVal(_characterVal(aCharacter)));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
        if (cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
            RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
        while (*cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
            if (*cp == byteValue) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
                RETURN ( true );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
            cp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
10
claus
parents: 5
diff changeset
   676
includesMatchCharacters
claus
parents: 5
diff changeset
   677
    "return true if the receiver includes any meta characters (i.e. $* or $#) 
claus
parents: 5
diff changeset
   678
     for match operations; false if not"
claus
parents: 5
diff changeset
   679
claus
parents: 5
diff changeset
   680
    (self includes:$*) ifTrue:[^ true].
claus
parents: 5
diff changeset
   681
    ^ (self includes:$#)
claus
parents: 5
diff changeset
   682
!
claus
parents: 5
diff changeset
   683
claus
parents: 5
diff changeset
   684
includesAny:aCollection
claus
parents: 5
diff changeset
   685
    "return true, if the receiver includes any of the characters in the
claus
parents: 5
diff changeset
   686
     argument, aCollecition"
claus
parents: 5
diff changeset
   687
claus
parents: 5
diff changeset
   688
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   689
claus
parents: 5
diff changeset
   690
    REGISTER unsigned char *cp;
claus
parents: 5
diff changeset
   691
    REGISTER unsigned char *matchP;
claus
parents: 5
diff changeset
   692
    extern char *strchr();
claus
parents: 5
diff changeset
   693
claus
parents: 5
diff changeset
   694
    if (_isString(aCollection)) {
claus
parents: 5
diff changeset
   695
        matchP = _stringVal(aCollection);
claus
parents: 5
diff changeset
   696
        cp = _stringVal(self);
claus
parents: 5
diff changeset
   697
        if (_qClass(self) != String)
claus
parents: 5
diff changeset
   698
            cp += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
claus
parents: 5
diff changeset
   699
        while (*cp) {
claus
parents: 5
diff changeset
   700
            if (index(matchP, *cp)) {
claus
parents: 5
diff changeset
   701
                RETURN ( true );
claus
parents: 5
diff changeset
   702
            }
claus
parents: 5
diff changeset
   703
            cp++;
claus
parents: 5
diff changeset
   704
        }
claus
parents: 5
diff changeset
   705
        RETURN ( false );
claus
parents: 5
diff changeset
   706
    }
claus
parents: 5
diff changeset
   707
%}
claus
parents: 5
diff changeset
   708
.
claus
parents: 5
diff changeset
   709
    ^ super includesAny:aCollection
claus
parents: 5
diff changeset
   710
!
claus
parents: 5
diff changeset
   711
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
indexOf:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
    "return the index of the first occurrences of the argument, aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
     in the receiver or 0 if not found - reimplemented here for speed."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
#ifdef FAST_STRCHR
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
    char *strchr();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
    REGISTER int byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
    REGISTER int index;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
a27a279701f8 Initial revision
claus
parents:
diff changeset
   726
    if (_isCharacter(aCharacter)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
        cp = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
        if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
            cp += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
#ifdef FAST_STRCHR
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
        cp = (unsigned char *) strchr(cp, _intVal(_characterVal(aCharacter)));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
        if (cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
            RETURN ( _MKSMALLINT(cp - _stringVal(self) + 1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
        byteValue = _intVal(_characterVal(aCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
        index = 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
        while (*cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
            if (*cp++ == byteValue) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
                RETURN ( _MKSMALLINT(index) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   741
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
            index++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   745
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   748
    ^ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   750
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
indexOf:aCharacter startingAt:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   752
    "return the index of the first occurrence of the argument, aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
     in myself starting at start, anInteger or 0 if not found;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   757
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
    REGISTER int index, byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   760
#ifdef FAST_STRCHR
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
    char *strchr();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   763
    int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   764
a27a279701f8 Initial revision
claus
parents:
diff changeset
   765
    if (_isSmallInteger(start)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   766
        if (_isCharacter(aCharacter)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
            byteValue = _intVal(_characterVal(aCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   768
            index = _intVal(start);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   769
            if (index <= 0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   770
                index = 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   771
            if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   772
                index += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
            len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
            if (index <= len) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
                cp = _stringVal(self) + index - 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
#ifdef FAST_STRCHR
a27a279701f8 Initial revision
claus
parents:
diff changeset
   777
                cp = (unsigned char *) strchr(cp, byteValue);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
                if (cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
                    RETURN ( _MKSMALLINT(cp - _stringVal(self) + 1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
                while (*cp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
                    if (*cp++ == byteValue) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
                        RETURN ( _MKSMALLINT(index) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
                    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   786
                    index++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   789
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
        RETURN ( _MKSMALLINT(0) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   792
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   794
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   795
    ^ super indexOf:aCharacter startingAt:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   796
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
indexOfSeparatorStartingAt:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   799
    "return the index of the next separator character"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   800
a27a279701f8 Initial revision
claus
parents:
diff changeset
   801
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   802
a27a279701f8 Initial revision
claus
parents:
diff changeset
   803
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   804
    REGISTER char c;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   805
    int len, index;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   806
a27a279701f8 Initial revision
claus
parents:
diff changeset
   807
    index = _intVal(start);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   808
    if (index <= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   809
        index = 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   810
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   811
    if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   812
        index += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   813
    len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   814
    if (index > len) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   815
        RETURN ( _MKSMALLINT(0) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   816
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   817
    cp = _stringVal(self) + index - 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   818
    while (c = *cp++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   819
#ifdef ASCII
a27a279701f8 Initial revision
claus
parents:
diff changeset
   820
        if (c <= ' ')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   821
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   822
        if ((c == ' ') || (c == '\t') || (c == '\n')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   823
         || (c == '\r') || (c == '\f')) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   824
            RETURN ( _MKSMALLINT(cp - _stringVal(self)) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   825
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   826
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   827
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   828
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   829
    ^ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   830
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   831
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   832
findString:subString 
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   833
    "find a substring. if found, return the index;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   834
     if not found, return 0"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   835
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   836
    ^ self findString:subString startingAt:1 ifAbsent:[0]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   837
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   838
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   839
findString:subString startingAt:index
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   840
    "find a substring, starting at index. if found, return the index;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   841
     if not found, return 0"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   842
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   843
    ^ self findString:subString startingAt:index ifAbsent:[0]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   844
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   845
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   846
findString:subString startingAt:index ifAbsent:exceptionBlock
2
claus
parents: 1
diff changeset
   847
    "find a substring, starting at index. if found, return the index;
claus
parents: 1
diff changeset
   848
     if not found, return the result of evaluating exceptionBlock.
claus
parents: 1
diff changeset
   849
     This is a q&d hack - not very efficient"
claus
parents: 1
diff changeset
   850
claus
parents: 1
diff changeset
   851
    |firstChar startIndex subSize mySize runIdx found|
claus
parents: 1
diff changeset
   852
claus
parents: 1
diff changeset
   853
    subSize := subString size.
claus
parents: 1
diff changeset
   854
    subSize == 0 ifTrue:[^ index]. "empty string matches"
claus
parents: 1
diff changeset
   855
    mySize := self size.
claus
parents: 1
diff changeset
   856
    firstChar := subString at:1.
claus
parents: 1
diff changeset
   857
    startIndex := self indexOf:firstChar startingAt:index.
claus
parents: 1
diff changeset
   858
    [startIndex == 0] whileFalse:[
claus
parents: 1
diff changeset
   859
        runIdx := startIndex.
claus
parents: 1
diff changeset
   860
        found := true.
claus
parents: 1
diff changeset
   861
        1 to:subSize do:[:i |
claus
parents: 1
diff changeset
   862
            runIdx > mySize ifTrue:[
claus
parents: 1
diff changeset
   863
                found := false
claus
parents: 1
diff changeset
   864
            ] ifFalse:[
claus
parents: 1
diff changeset
   865
                (subString at:i) ~~ (self at:runIdx) ifTrue:[
claus
parents: 1
diff changeset
   866
                    found := false
claus
parents: 1
diff changeset
   867
                ]
claus
parents: 1
diff changeset
   868
            ].
claus
parents: 1
diff changeset
   869
            runIdx := runIdx + 1
claus
parents: 1
diff changeset
   870
        ].
claus
parents: 1
diff changeset
   871
        found ifTrue:[
claus
parents: 1
diff changeset
   872
            ^ startIndex
claus
parents: 1
diff changeset
   873
        ].
claus
parents: 1
diff changeset
   874
        startIndex := self indexOf:firstChar startingAt:(startIndex + 1)
claus
parents: 1
diff changeset
   875
    ].
claus
parents: 1
diff changeset
   876
    ^ exceptionBlock value
claus
parents: 1
diff changeset
   877
!
claus
parents: 1
diff changeset
   878
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   879
from:matchStart to:matchStop match:aString from:start to:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   880
    "helper for match; return true if the characters from start to stop in
a27a279701f8 Initial revision
claus
parents:
diff changeset
   881
     aString are matching the receivers characters from matchStart to matchStop.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   882
     The receiver may contain meta-match characters $* (to match any string) 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   883
     or $# (to match any character)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   884
2
claus
parents: 1
diff changeset
   885
    |matchChar mStart mStop sStart sStop mSize sSize index cont matchLast
claus
parents: 1
diff changeset
   886
     matchSet c1 c2|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   887
a27a279701f8 Initial revision
claus
parents:
diff changeset
   888
    mStart := matchStart.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   889
    mStop := matchStop.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   890
    sStart := start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   891
    sStop := stop.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   892
a27a279701f8 Initial revision
claus
parents:
diff changeset
   893
    [true] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   894
        mSize := mStop - mStart + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   895
        sSize := sStop - sStart + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   896
a27a279701f8 Initial revision
claus
parents:
diff changeset
   897
        "empty strings match"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   898
        (mSize == 0) ifTrue:[^ (sSize == 0)].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   899
a27a279701f8 Initial revision
claus
parents:
diff changeset
   900
        matchChar := self at:mStart.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   901
a27a279701f8 Initial revision
claus
parents:
diff changeset
   902
        (matchChar == $#) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   903
            "testString empty -> no match"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   904
            (sSize == 0) ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   905
            "# matches single character"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   906
            ((sSize == 1) and:[mSize == 1]) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   907
            "cut off 1st chars and continue"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   908
            mStart := mStart + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   909
            sStart := sStart + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   910
        ] ifFalse:[
2
claus
parents: 1
diff changeset
   911
            (matchChar == $[) ifTrue:[
claus
parents: 1
diff changeset
   912
                "testString empty -> no match"
claus
parents: 1
diff changeset
   913
                (sSize == 0) ifTrue:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   914
2
claus
parents: 1
diff changeset
   915
                matchSet := Set new.
claus
parents: 1
diff changeset
   916
                c1 := nil.
claus
parents: 1
diff changeset
   917
                [matchChar == $]] whileFalse:[
claus
parents: 1
diff changeset
   918
                    mStart := mStart + 1.
claus
parents: 1
diff changeset
   919
                    mSize := mSize - 1.
claus
parents: 1
diff changeset
   920
                    matchChar := self at:mStart.
claus
parents: 1
diff changeset
   921
                    ((matchChar == $-) and:[c1 notNil]) ifTrue:[
claus
parents: 1
diff changeset
   922
                        mStart := mStart + 1.
claus
parents: 1
diff changeset
   923
                        mSize := mSize - 1.
claus
parents: 1
diff changeset
   924
                        c2 := self at:mStart.
claus
parents: 1
diff changeset
   925
                        (c1 to:c2) do:[:c | matchSet add:c].
claus
parents: 1
diff changeset
   926
                        c1 := nil
claus
parents: 1
diff changeset
   927
                    ] ifFalse:[
claus
parents: 1
diff changeset
   928
                        (matchChar == $]) ifFalse:[
claus
parents: 1
diff changeset
   929
                            matchSet add:matchChar.
claus
parents: 1
diff changeset
   930
                            c1 := matchChar.
claus
parents: 1
diff changeset
   931
                        ].
claus
parents: 1
diff changeset
   932
                    ].
claus
parents: 1
diff changeset
   933
                ].
claus
parents: 1
diff changeset
   934
                mStart := mStart + 1.
claus
parents: 1
diff changeset
   935
                mSize := mSize - 1.
claus
parents: 1
diff changeset
   936
                (matchSet includes:(aString at:sStart)) ifFalse:[^ false].
claus
parents: 1
diff changeset
   937
                ((sSize == 1) and:[mSize == 0]) ifTrue:[^ true].
claus
parents: 1
diff changeset
   938
                "cut off 1st char and continue"
claus
parents: 1
diff changeset
   939
                sStart := sStart + 1
claus
parents: 1
diff changeset
   940
            ] ifFalse:[
claus
parents: 1
diff changeset
   941
                (matchChar == $*) ifTrue:[
claus
parents: 1
diff changeset
   942
                    "* matches anything"
claus
parents: 1
diff changeset
   943
                    (mSize == 1) ifTrue:[^ true].
claus
parents: 1
diff changeset
   944
                    "testString empty -> matchString not we have no match"
claus
parents: 1
diff changeset
   945
                    (sSize == 0) ifTrue:[^ false].
claus
parents: 1
diff changeset
   946
claus
parents: 1
diff changeset
   947
                    "try to avoid some of the recursion by checking last
claus
parents: 1
diff changeset
   948
                     character and continue with shortened strings if possible"
claus
parents: 1
diff changeset
   949
                    cont := false.
claus
parents: 1
diff changeset
   950
                    (mStop >= mStart) ifTrue:[
claus
parents: 1
diff changeset
   951
                        matchLast := self at:mStop.
claus
parents: 1
diff changeset
   952
                        (matchLast ~~ $*) ifTrue:[
claus
parents: 1
diff changeset
   953
                            (matchLast == $#) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   954
                                cont := true
2
claus
parents: 1
diff changeset
   955
                            ] ifFalse:[
claus
parents: 1
diff changeset
   956
                                (matchLast == (aString at:sStop)) ifTrue:[
claus
parents: 1
diff changeset
   957
                                    cont := true
claus
parents: 1
diff changeset
   958
                                ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   959
                            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   960
                        ]
2
claus
parents: 1
diff changeset
   961
                    ].
claus
parents: 1
diff changeset
   962
                    cont ifFalse:[
claus
parents: 1
diff changeset
   963
                        index := sStart.
claus
parents: 1
diff changeset
   964
                        [index <= sStop] whileTrue:[
claus
parents: 1
diff changeset
   965
                            (self from:(mStart + 1) to:mStop match:aString 
claus
parents: 1
diff changeset
   966
                                  from:index to:sStop) ifTrue:[
claus
parents: 1
diff changeset
   967
                                ^ true
claus
parents: 1
diff changeset
   968
                            ].
claus
parents: 1
diff changeset
   969
                            index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   970
                        ].
2
claus
parents: 1
diff changeset
   971
                        ^ false
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   972
                    ].
2
claus
parents: 1
diff changeset
   973
                    mStop := mStop - 1.
claus
parents: 1
diff changeset
   974
                    sStop := sStop - 1
claus
parents: 1
diff changeset
   975
                ] ifFalse:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   976
2
claus
parents: 1
diff changeset
   977
                    "testString empty ?"
claus
parents: 1
diff changeset
   978
                    (sSize == 0) ifTrue:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   979
2
claus
parents: 1
diff changeset
   980
                    "first characters equal ?"
claus
parents: 1
diff changeset
   981
                    ((aString at:sStart) ~~ matchChar) ifTrue:[^ false].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   982
2
claus
parents: 1
diff changeset
   983
                    "avoid recursion if possible"
claus
parents: 1
diff changeset
   984
                    ((sSize == mSize) and:[self = aString]) ifTrue:[^ true].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   985
2
claus
parents: 1
diff changeset
   986
                    "cut off 1st chars and continue"
claus
parents: 1
diff changeset
   987
                    mStart := mStart + 1.
claus
parents: 1
diff changeset
   988
                    sStart := sStart + 1
claus
parents: 1
diff changeset
   989
                ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   990
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   991
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   992
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   993
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   994
a27a279701f8 Initial revision
claus
parents:
diff changeset
   995
match:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   996
    "return true if aString matches self, where self may contain meta-match 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   997
     characters $* (to match any string) or $# (to match any character)."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   998
a27a279701f8 Initial revision
claus
parents:
diff changeset
   999
    ^ self from:1 to:(self size) match:aString from:1 to:(aString size)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1000
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1001
    " '*ute*' match:'computer' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1002
    " '*uter' match:'computer' "
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1003
    " 'uter*' match:'computer' "
2
claus
parents: 1
diff changeset
  1004
    " '*ute*' match:'' "
claus
parents: 1
diff changeset
  1005
    " '[abcd]*' match:'computer' "
claus
parents: 1
diff changeset
  1006
    " '[abcd]*' match:'komputer' "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1007
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1008
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1009
startsWith:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1010
    "return true, if the receiver starts with something, aString"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1011
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1012
    (aString isKindOf:String) ifFalse: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1013
        (aString isMemberOf:Character) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1014
            self isEmpty ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1015
            ^ (self at:1) == aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1016
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1017
        ^ super startsWith:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1018
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1019
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1020
    int len1, len2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1021
    REGISTER unsigned char *src1, *src2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1022
    REGISTER OBJ s = aString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1023
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1024
    len1 = _qSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1025
    src1 = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1026
    if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1027
        int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1028
        len1 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1029
        src1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1030
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1031
    len2 = _qSize(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1032
    src2 = _stringVal(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1033
    if (_qClass(s) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1034
        int n = _intVal(_ClassInstPtr(_qClass(s))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1035
        len2 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1036
        src2 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1037
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1038
    if (len1 < len2) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1039
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1040
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1041
    while (*src2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1042
        if (*src2++ != *src1++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1043
            RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1044
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1045
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1046
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1047
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1048
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1049
    "'hello world' startsWith:'hello'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1050
    "'hello world' startsWith:'hi'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1051
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1052
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1053
endsWith:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1054
    "return true, if the receiver end with something, aString"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1055
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1056
    (aString isKindOf:String) ifFalse: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1057
        (aString isMemberOf:Character) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1058
            self isEmpty ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1059
            ^ (self at:(self size)) == aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1060
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1061
        ^ super endsWith:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1062
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1063
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1064
    int len1, len2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1065
    REGISTER unsigned char *src1, *src2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1066
    REGISTER OBJ s = aString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1067
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1068
    len1 = _qSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1069
    src1 = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1070
    if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1071
        int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1072
        len1 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1073
        src1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1074
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1075
    len2 = _qSize(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1076
    src2 = _stringVal(s);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1077
    if (_qClass(s) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1078
        int n = _intVal(_ClassInstPtr(_qClass(s))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1079
        len2 -= n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1080
        src2 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1081
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1082
    if (len1 < len2) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1083
        RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1084
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1085
    src1 = _stringVal(self) + len1 - len2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1086
    src2 = _stringVal(aString);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1087
    while (*src2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1088
        if (*src2++ != *src1++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1089
            RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1090
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1091
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1092
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1093
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1094
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1095
    "'hello world' endsWith:'world'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1096
    "'hello world' endsWith:'earth'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1097
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1098
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1099
isBlank
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1100
    "return true, if the receiver contains spaces only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1101
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1102
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1103
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1104
    REGISTER unsigned char *src;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1105
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1106
    src = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1107
    if (_qClass(self) != String)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1108
        src += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1109
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1110
    while (*src)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1111
        if (*src++ != ' ') {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1112
            RETURN ( false );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1113
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1114
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1115
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1116
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1117
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1118
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1119
countWords
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1120
    "return the number of words, which are separated by separators"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1121
10
claus
parents: 5
diff changeset
  1122
    |tally start stop mySize ch|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1123
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1124
    tally := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1125
    start := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1126
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1127
    [start <= mySize] whileTrue:[
10
claus
parents: 5
diff changeset
  1128
         ch := self at:start.
claus
parents: 5
diff changeset
  1129
         ((ch == Character space) or:[ch isSeparator]) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1130
             start := start + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1131
         ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1132
             stop := self indexOfSeparatorStartingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1133
             (stop == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1134
                 stop := mySize + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1135
             ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1136
             tally := tally + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1137
             start := stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1138
         ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1139
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1140
    ^ tally
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1141
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1142
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1143
asCollectionOfWords
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1144
    "return a collection containing the words (separated by whitespace) of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1145
10
claus
parents: 5
diff changeset
  1146
    |words start stop mySize ch|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1147
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1148
    words := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1149
    start := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1150
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1151
    [start <= mySize] whileTrue:[
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1152
        ch := self at:start.
10
claus
parents: 5
diff changeset
  1153
        ((ch == Character space) or:[ch isSeparator]) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1154
            start := start + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1155
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1156
            stop := self indexOfSeparatorStartingAt:start.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1157
            stop == 0 ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1158
                words add:(self copyFrom:start to:mySize).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1159
                ^ words
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1160
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1161
            words add:(self copyFrom:start to:(stop - 1)).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1162
            start := stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1163
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1164
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1165
    ^ words
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1166
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1167
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1168
levenshteinTo:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1169
    "return the levenshtein distance to the argument, aString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1170
     this value corrensponds to the number of replacements that have to be
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1171
     made to get aString from the receiver.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1172
     see IEEE transactions on Computers 1976 Pg 172 ff."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1173
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1174
    ^ self levenshteinTo:aString s:4 c:1 i:2 d:6
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1175
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1176
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1177
levenshteinTo:aString s:substWeight c:caseWeight i:insrtWeight d:deleteWeight
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1178
    "parametrized levenshtein. arguments are the costs for
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1179
     substitution, case-change, insertion and deletion of a character."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1180
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1181
    |d  "delta matrix"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1182
     len1 len2 dim prevRow row col dimPlus1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1183
     min pp c1 c2|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1184
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1185
%{  /* STACK: 4000 */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1186
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1187
    /* 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1188
     * this is very heavy used when correcting errors 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1189
     * (all symbols are searched for best match) - therefore it must be fast
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1190
     */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1191
{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1192
    unsigned short *data;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1193
    int l1, l2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1194
    REGISTER int sz;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1195
    unsigned char *s1, *s2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1196
    int v1, v2, v3, m;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1197
    REGISTER unsigned short *dp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1198
    REGISTER int delta;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1199
    REGISTER int j;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1200
    int i;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1201
    int iW, cW, sW, dW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1202
#   define FASTSIZE 30
2
claus
parents: 1
diff changeset
  1203
    unsigned short fastData[(FASTSIZE + 1) * (FASTSIZE + 1)];
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1204
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1205
    if ((_isString(self) || _isSymbol(self))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1206
     && (_isString(aString) || _isSymbol(aString))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1207
     && _isSmallInteger(insrtWeight) && _isSmallInteger(caseWeight)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1208
     && _isSmallInteger(substWeight) && _isSmallInteger(deleteWeight)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1209
        iW = _intVal(insrtWeight);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1210
        cW = _intVal(caseWeight);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1211
        sW = _intVal(substWeight);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1212
        dW = _intVal(deleteWeight);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1213
        s1 = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1214
        s2 = _stringVal(aString);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1215
        l1 = strlen(s1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1216
        l2 = strlen(s2);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1217
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1218
        sz = (l1 < l2) ? l2 : l1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1219
        delta = sz + 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1220
        if (sz <= FASTSIZE) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1221
            data = fastData;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1222
        } else {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1223
            /* add ifdef ALLOCA here ... */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1224
            data = (unsigned short *)malloc(delta * delta * sizeof(short));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1225
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1226
        
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1227
        data[0] = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1228
        dp = data+1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1229
        for (j=1, dp=data+1; j<=sz; j++, dp++)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1230
            *dp = *(dp-1) + iW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1231
        
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1232
        for (i=1, dp=data+delta; i<=sz; i++, dp+=delta)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1233
            *dp = *(dp-delta) + dW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1234
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1235
        for (i=1; i<=l1; i++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1236
            for (j=1; j<=l2; j++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1237
                dp = data + (i*delta) + j;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1238
                if (s1[i] != s2[j]) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1239
                    if (tolower(s1[i]) == tolower(s2[j])) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1240
                        m = cW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1241
                    } else {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1242
                        m = sW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1243
                    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1244
                } else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1245
                    m = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1246
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1247
                v2 = *(dp - 1) + iW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1248
                v3 = *(dp - delta) + dW;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1249
                v1 = *(dp - delta - 1) + m;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1250
                if (v1 < v2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1251
                    if (v1 < v3)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1252
                        m = v1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1253
                    else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1254
                        m = v3;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1255
                else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1256
                    if (v2 < v3)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1257
                        m = v2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1258
                    else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1259
                        m = v3;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1260
                *dp = m;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1261
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1262
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1263
        m = data[l1 * delta + l2];
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1264
        if (sz > FASTSIZE) 
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1265
            free(data);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1266
        RETURN ( _MKSMALLINT(m) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1267
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1268
}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1269
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1270
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1271
    len1 := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1272
    len2 := aString size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1273
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1274
    "create the help-matrix"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1275
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1276
    dim := len1 max:len2.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1277
    dimPlus1 := dim + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1278
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1279
    d := Array new:dimPlus1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1280
    1 to:dimPlus1 do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1281
        d at:i put:(Array new:dimPlus1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1282
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1283
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1284
    "init help-matrix"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1285
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1286
    (d at:1) at:1 put:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1287
    row := d at:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1288
    1 to:dim do:[:j |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1289
        row at:(j + 1) put:( (row at:j) + insrtWeight )
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1290
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1291
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1292
    1 to:dim do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1293
         (d at:(i + 1)) at:1 put:(  ((d at:i) at:1) + deleteWeight )
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1294
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1295
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1296
    1 to:len1 do:[:i |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1297
        c1 := self at:i.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1298
        1 to:len2 do:[:j |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1299
            c2 := aString at:j.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1300
            (c1 == c2) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1301
                pp := 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1302
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1303
                (c1 asLowercase == c2 asLowercase) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1304
                    pp := caseWeight
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1305
                ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1306
                    pp := substWeight
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1307
                ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1308
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1309
            prevRow := d at:i.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1310
            row := d at:(i + 1).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1311
            col := j + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1312
            min := (prevRow at:j) + pp.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1313
            min := min min:( (row at:j) + insrtWeight).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1314
            min := min min:( (prevRow at:col) + deleteWeight).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1315
            row at:col put: min
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1316
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1317
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1318
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1319
    ^ (d at:(len1 + 1)) at:(len2 + 1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1320
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1321
    "'ocmprt' levenshteinTo:'computer'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1322
     'computer' levenshteinTo:'computer'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1323
     'ocmputer' levenshteinTo:'computer'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1324
     'cmputer' levenshteinTo:'computer'
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1325
     'Computer' levenshteinTo:'computer'"
2
claus
parents: 1
diff changeset
  1326
!
claus
parents: 1
diff changeset
  1327
claus
parents: 1
diff changeset
  1328
spellAgainst: aString 
claus
parents: 1
diff changeset
  1329
    "return an integer between 0 and 100 indicating how similar 
claus
parents: 1
diff changeset
  1330
     the argument is to the receiver.  No case conversion is done."
claus
parents: 1
diff changeset
  1331
claus
parents: 1
diff changeset
  1332
    | i1     "{ Class: SmallInteger }"
claus
parents: 1
diff changeset
  1333
      i2     "{ Class: SmallInteger }"
claus
parents: 1
diff changeset
  1334
      size1  "{ Class: SmallInteger }"
claus
parents: 1
diff changeset
  1335
      size2  "{ Class: SmallInteger }"
claus
parents: 1
diff changeset
  1336
      score  "{ Class: SmallInteger }"
claus
parents: 1
diff changeset
  1337
      maxLen "{ Class: SmallInteger }" |
claus
parents: 1
diff changeset
  1338
claus
parents: 1
diff changeset
  1339
    size1 := self size.
claus
parents: 1
diff changeset
  1340
    size2 := aString size.
claus
parents: 1
diff changeset
  1341
    maxLen := size1 max: size2.
claus
parents: 1
diff changeset
  1342
    score := 0.
claus
parents: 1
diff changeset
  1343
    i1 := i2 := 1.
claus
parents: 1
diff changeset
  1344
    [i1 <= size1 and: [i2 <= size2]] whileTrue:[
claus
parents: 1
diff changeset
  1345
        (self at: i1) == (aString at: i2) ifTrue: [
claus
parents: 1
diff changeset
  1346
            score := score+1.             
claus
parents: 1
diff changeset
  1347
            i1 := i1+1.                    
claus
parents: 1
diff changeset
  1348
            i2 := i2+1
claus
parents: 1
diff changeset
  1349
        ] ifFalse: [
claus
parents: 1
diff changeset
  1350
            (i2 < size2 and: [(self at: i1) == (aString at: i2+1)]) ifTrue: [
claus
parents: 1
diff changeset
  1351
                i2 := i2+1
claus
parents: 1
diff changeset
  1352
            ] ifFalse: [
claus
parents: 1
diff changeset
  1353
                (i1 < size1 and: [(self at: i1+1) == (aString at: i2)]) ifTrue: [
claus
parents: 1
diff changeset
  1354
                    i1 := i1+1
claus
parents: 1
diff changeset
  1355
                ] ifFalse: [
claus
parents: 1
diff changeset
  1356
                    i1 := i1+1.
claus
parents: 1
diff changeset
  1357
                    i2 := i2+1
claus
parents: 1
diff changeset
  1358
                ] 
claus
parents: 1
diff changeset
  1359
            ] 
claus
parents: 1
diff changeset
  1360
        ] 
claus
parents: 1
diff changeset
  1361
    ].
claus
parents: 1
diff changeset
  1362
claus
parents: 1
diff changeset
  1363
    score = maxLen ifTrue: [^100].
claus
parents: 1
diff changeset
  1364
    ^100*score//maxLen
claus
parents: 1
diff changeset
  1365
claus
parents: 1
diff changeset
  1366
    " 'Smalltalk' spellAgainst: 'Smalltlak' "
claus
parents: 1
diff changeset
  1367
    " 'Smalltalk' spellAgainst: 'smalltlak' "
claus
parents: 1
diff changeset
  1368
    " 'Smalltalk' spellAgainst: 'smalltalk' "
claus
parents: 1
diff changeset
  1369
    " 'Smalltalk' spellAgainst: 'smalltlk' "
claus
parents: 1
diff changeset
  1370
    " 'Smalltalk' spellAgainst: 'Smalltolk' "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1371
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1372
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1373
!String methodsFor:'copying'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1374
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1375
shallowCopy
2
claus
parents: 1
diff changeset
  1376
    "return a copy of the receiver"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1377
2
claus
parents: 1
diff changeset
  1378
    (self isMemberOf:String) ifTrue:[
claus
parents: 1
diff changeset
  1379
        ^ self copyFrom:1
claus
parents: 1
diff changeset
  1380
    ].
claus
parents: 1
diff changeset
  1381
    ^ super shallowCopy
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1382
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1383
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1384
deepCopyUsing:aDictionary
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1385
    "return a copy of the receiver - reimplemented to be a bit faster"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1386
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1387
    (self isMemberOf:String) ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1388
        ^ self copyFrom:1
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1389
    ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1390
    ^ super deepCopy
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1391
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1392
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1393
simpleDeepCopy
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1394
    "return a copy of the receiver"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1395
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1396
    (self isMemberOf:String) ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1397
        ^ self copyFrom:1
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1398
    ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1399
    ^ super deepCopy
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1400
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1401
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1402
deepCopy
2
claus
parents: 1
diff changeset
  1403
    "return a copy of the receiver"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1404
2
claus
parents: 1
diff changeset
  1405
    (self isMemberOf:String) ifTrue:[
claus
parents: 1
diff changeset
  1406
        ^ self copyFrom:1
claus
parents: 1
diff changeset
  1407
    ].
claus
parents: 1
diff changeset
  1408
    ^ super deepCopy
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1409
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1410
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1411
, aString
2
claus
parents: 1
diff changeset
  1412
    "return the concatenation of myself and the argument, aString as
claus
parents: 1
diff changeset
  1413
     a String.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1414
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1415
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1416
%{
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1417
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1418
    int l1, l2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1419
    char *cp1, *cp2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1420
    REGISTER unsigned char *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1421
    REGISTER OBJ s = aString;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1422
    OBJ myClass, argClass, newString;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1423
    OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1424
2
claus
parents: 1
diff changeset
  1425
    if (_isNonNilObject(s)) {
claus
parents: 1
diff changeset
  1426
        myClass = _qClass(self);
claus
parents: 1
diff changeset
  1427
        argClass = _qClass(s);
claus
parents: 1
diff changeset
  1428
        if ((myClass == argClass)
claus
parents: 1
diff changeset
  1429
         || (((myClass == String) || (myClass == Symbol))
claus
parents: 1
diff changeset
  1430
             && ((argClass == String) || (argClass == Symbol)))) {
claus
parents: 1
diff changeset
  1431
                cp1 = (char *) _stringVal(self);
claus
parents: 1
diff changeset
  1432
                l1 = _stringSize(self);
claus
parents: 1
diff changeset
  1433
                if (myClass != String) {
claus
parents: 1
diff changeset
  1434
                    int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1435
2
claus
parents: 1
diff changeset
  1436
                    cp1 += n;
claus
parents: 1
diff changeset
  1437
                    l1 -= n;
claus
parents: 1
diff changeset
  1438
                }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1439
2
claus
parents: 1
diff changeset
  1440
                cp2 = (char *) _stringVal(s);
claus
parents: 1
diff changeset
  1441
                l2 = _stringSize(s);
claus
parents: 1
diff changeset
  1442
                if (argClass != String) {
claus
parents: 1
diff changeset
  1443
                    int n = _intVal(_ClassInstPtr(_qClass(s))->c_ninstvars) * sizeof(OBJ);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1444
2
claus
parents: 1
diff changeset
  1445
                    cp2 += n;
claus
parents: 1
diff changeset
  1446
                    l2 -= n;
claus
parents: 1
diff changeset
  1447
                }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1448
2
claus
parents: 1
diff changeset
  1449
                _qNew(newString, OHDR_SIZE + l1 + l2 + 1, __context);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1450
                if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1451
                    _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1452
                    dstp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1453
#ifdef FAST_MEMCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1454
                    bcopy(cp1, dstp, l1);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1455
                    bcopy(cp2, dstp + l1, l2+1);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1456
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1457
# ifdef FAST_STRCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1458
                    strcpy(dstp, cp1);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1459
                    strcpy(dstp + l1, cp2);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1460
# else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1461
                    while ((*dstp++ = *cp1++) != '\0') ;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1462
                    dstp--;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1463
                    while ((*dstp++ = *cp2++) != '\0') ;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1464
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1465
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1466
                    RETURN ( newString );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1467
                }
2
claus
parents: 1
diff changeset
  1468
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1469
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1470
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1471
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1472
    ^ super , aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1473
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1474
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1475
concatenate:string1 and:string2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1476
    "return the concatenation of myself and the arguments, string1 and string2.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1477
     This is equivalent to self , string1 , string2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1478
     - generated by compiler when such a construct is detected"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1479
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1480
    |newString|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1481
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1482
    int len1, len2, len3;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1483
#if !defined(FAST_MEMCPY) && !defined(FAST_STRCPY)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1484
    REGISTER unsigned char *srcp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1485
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1486
    REGISTER unsigned char *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1487
    OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1488
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1489
    if ((_isString(self) || _isSymbol(self))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1490
     && (_isString(string1) || _isSymbol(string1))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1491
     && (_isString(string2) || _isSymbol(string2))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1492
        len1 = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1493
        len2 = _stringSize(string1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1494
        len3 = _stringSize(string2);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1495
        _qNew(newString, OHDR_SIZE + len1 + len2 + len3 + 1, __context);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1496
        if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1497
            _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1498
            dstp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1499
#ifdef FAST_MEMCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1500
            bcopy(_stringVal(self), dstp, len1);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1501
            bcopy(_stringVal(string1), dstp + len1, len2);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1502
            bcopy(_stringVal(string2), dstp + len1 + len2, len3+1);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1503
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1504
# ifdef FAST_STRCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1505
            strcpy(dstp, _stringVal(self));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1506
            strcpy(dstp + len1, _stringVal(string1));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1507
            strcpy(dstp + len1 + len2, _stringVal(string2));
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1508
# else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1509
            srcp = _stringVal(self);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1510
            while ((*dstp++ = *srcp++) != '\0') ;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1511
            dstp--;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1512
            srcp = _stringVal(string1);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1513
            while ((*dstp++ = *srcp++) != '\0') ;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1514
            dstp--;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1515
            srcp = _stringVal(string2);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1516
            while ((*dstp++ = *srcp++) != '\0') ;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1517
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1518
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1519
            RETURN ( newString );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1520
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1521
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1522
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1523
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1524
    ^ super , string1 , string2
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1525
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1526
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1527
concatenate:string1 and:string2 and:string3
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1528
    "return the concatenation of myself and the string arguments.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1529
     This is equivalent to self , string1 , string2 , string3
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1530
     - generated by compiler when such a construct is detected"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1531
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1532
    |newString|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1533
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1534
    int len1, len2, len3, len4;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1535
#if !defined(FAST_MEMCPY) && !defined(FAST_STRCPY)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1536
    REGISTER unsigned char *srcp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1537
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1538
    REGISTER unsigned char *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1539
    OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1540
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1541
    if ((_isString(self) || _isSymbol(self))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1542
     && (_isString(string1) || _isSymbol(string1))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1543
     && (_isString(string2) || _isSymbol(string2))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1544
     && (_isString(string3) || _isSymbol(string3))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1545
        len1 = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1546
        len2 = _stringSize(string1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1547
        len3 = _stringSize(string2);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1548
        len4 = _stringSize(string3);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1549
        _qNew(newString, OHDR_SIZE + len1 + len2 + len3 + len4 + 1, __context);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1550
        if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1551
            _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1552
            dstp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1553
#ifdef FAST_MEMCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1554
            bcopy(_stringVal(self), dstp, len1);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1555
            bcopy(_stringVal(string1), dstp + len1, len2);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1556
            bcopy(_stringVal(string2), dstp + len1 + len2, len3);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1557
            bcopy(_stringVal(string3), dstp + len1 + len2 + len3, len4+1);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1558
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1559
# ifdef FAST_STRCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1560
            strcpy(dstp, _stringVal(self));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1561
            strcpy(dstp + len1, _stringVal(string1));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1562
            strcpy(dstp + len1 + len2, _stringVal(string2));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1563
            strcpy(dstp + len1 + len2 + len3, _stringVal(string3));
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1564
# else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1565
            srcp = _stringVal(self);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1566
            while ((*dstp++ = *srcp++) != '\0') ;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1567
            dstp--;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1568
            srcp = _stringVal(string1);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1569
            while ((*dstp++ = *srcp++) != '\0') ;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1570
            dstp--;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1571
            srcp = _stringVal(string2);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1572
            while ((*dstp++ = *srcp++) != '\0') ;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1573
            dstp--;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1574
            srcp = _stringVal(string3);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1575
            while ((*dstp++ = *srcp++) != '\0') ;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1576
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1577
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1578
            RETURN ( newString );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1579
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1580
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1581
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1582
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1583
    ^ super , string1 , string2 , string3
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1584
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1585
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1586
copyWith:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1587
    "return the concatenation of myself and the argument, aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1588
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1589
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1590
%{  /* NOCONTEXT */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1591
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1592
    int sz;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1593
    REGISTER unsigned char *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1594
    int offs;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1595
    OBJ newString;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1596
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1597
    if (_isCharacter(aCharacter)) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1598
        sz = _qSize(self) + 1;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1599
        if (_qClass(self) != String) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1600
            offs = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1601
            sz -= offs;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1602
        } else
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1603
            offs = 0;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1604
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1605
        PROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1606
        _qNew(newString, sz, SENDER);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1607
        UNPROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1608
        if (newString) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1609
            _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1610
            dstp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1611
#ifdef FAST_MEMCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1612
            sz = sz - OHDR_SIZE - 1 - 1;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1613
            bcopy(_stringVal(self) + offs, dstp, sz);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1614
            dstp += sz;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1615
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1616
# ifdef FAST_STRCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1617
            strcpy(dstp, _stringVal(self) + offs);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1618
            dstp += sz - OHDR_SIZE - 1 - 1;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1619
# else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1620
            {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1621
                REGISTER unsigned char *srcp;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1622
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1623
                srcp = _stringVal(self) + offs;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1624
                while ((*dstp = *srcp++) != '\0')
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1625
                    dstp++;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1626
            }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1627
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1628
#endif
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1629
            *dstp++ = _intVal(_characterVal(aCharacter));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1630
            *dstp = '\0';
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1631
            RETURN (newString );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1632
        }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1633
    }
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1634
%}.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1635
    "fall back in case of non-character arg;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1636
     will eventually lead to an bad element signal raise"
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1637
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1638
    ^ super copyWith:aCharacter
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1639
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1640
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1641
copyFrom:start to:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1642
    "return the substring starting at index start, anInteger and ending
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1643
     at stop, anInteger.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1644
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1645
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1646
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1647
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1648
#if !defined(FAST_MEMCPY)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1649
    REGISTER unsigned char *srcp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1650
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1651
    REGISTER unsigned char *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1652
    REGISTER int count;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1653
    int len, index1, index2;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1654
    OBJ newString;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1655
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1656
    if (_isSmallInteger(start) && _isSmallInteger(stop)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1657
        len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1658
        index1 = _intVal(start);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1659
        index2 = _intVal(stop);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1660
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1661
        if ((index1 <= index2) && (index1 > 0)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1662
            if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1663
                int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1664
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1665
                index1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1666
                index2 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1667
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1668
            if (index2 <= len) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1669
                count = index2 - index1 + 1;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1670
                PROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1671
                _qNew(newString, OHDR_SIZE+count+1, SENDER);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1672
                UNPROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1673
                if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1674
                    _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1675
                    dstp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1676
#ifdef FAST_MEMCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1677
                    bcopy(_stringVal(self) + index1 - 1, dstp, count);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1678
                    dstp[count] = '\0';
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1679
#else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1680
                    srcp = _stringVal(self) + index1 - 1;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1681
                    while (count--) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1682
                        *dstp++ = *srcp++;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1683
                    }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1684
                    *dstp = '\0';
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1685
#endif
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1686
                    RETURN ( newString );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1687
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1688
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1689
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1690
    }
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1691
%}.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1692
    "fall back in case of non-integer index or out-of-bound index;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1693
     will eventually lead to an out-of-bound signal raise"
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1694
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1695
    ^ super copyFrom:start to:stop
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1696
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1697
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1698
copyFrom:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1699
    "return the substring from start, anInteger to the end
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1700
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1701
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1702
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1703
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1704
#if !defined(FAST_MEMCPY)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1705
    REGISTER unsigned char *srcp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1706
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1707
    REGISTER unsigned char *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1708
    REGISTER int count;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1709
    int len, index1;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1710
    OBJ newString;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1711
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1712
    if (_isSmallInteger(start)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1713
        len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1714
        index1 = _intVal(start);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1715
        if (index1 > 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1716
            if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1717
                int n = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1718
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1719
                index1 += n;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1720
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1721
            if (index1 <= len) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1722
                count = len - index1 + 1;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1723
                PROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1724
                _qNew(newString, OHDR_SIZE+count+1, SENDER);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1725
                UNPROTECT_CONTEXT
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1726
                if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1727
                    _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1728
                    dstp = _stringVal(newString);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1729
#ifdef FAST_MEMCPY
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1730
                    bcopy(_stringVal(self) + index1 - 1, dstp, count);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1731
                    dstp[count] = '\0';
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1732
#else
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1733
                    srcp = _stringVal(self) + index1 - 1;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1734
                    while (count--) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1735
                        *dstp++ = *srcp++;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1736
                    }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1737
                    *dstp = '\0';
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1738
#endif
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1739
                    RETURN ( newString );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1740
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1741
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1742
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1743
    }
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1744
%}.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1745
    "fall back in case of non-integer index or out-of-bound index;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1746
     will eventually lead to an out-of-bound signal raise"
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1747
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1748
    ^ super copyFrom:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1749
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1750
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1751
!String methodsFor:'filling and replacing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1752
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1753
replaceFrom:start to:stop with:aString startingAt:repStart
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1754
    "replace the characters starting at index start, anInteger and ending
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1755
     at stop, anInteger with characters from aString starting at repStart.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1756
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1757
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1758
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1759
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1760
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1761
    REGISTER unsigned char *srcp, *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1762
    REGISTER int count;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1763
    int len, index1, index2;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1764
    int repLen, repIndex;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1765
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1766
    if ((_isString(aString) || _isSymbol(aString))
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1767
     && _isString(self)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1768
     && _isSmallInteger(start)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1769
     && _isSmallInteger(stop)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1770
        len = _stringSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1771
        index1 = _intVal(start);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1772
        index2 = _intVal(stop);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1773
        count = index2 - index1 + 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1774
        if (count <= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1775
             RETURN (self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1776
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1777
        if ((index2 <= len) && (index1 > 0)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1778
            repLen = _stringSize(aString);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1779
            repIndex = _intVal(repStart);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1780
            if ((repIndex > 0) && ((repIndex + count - 1) <= repLen)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1781
                srcp = _stringVal(aString) + repIndex - 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1782
                dstp = _stringVal(self) + index1 - 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1783
                if (aString == self) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1784
                    /* take care of overlapping copy */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1785
                    if (srcp < dstp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1786
                        /* must do a reverse copy */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1787
                        srcp += count;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1788
                        dstp += count;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1789
                        while (count-- > 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1790
                            *--dstp = *--srcp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1791
                        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1792
                        RETURN (self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1793
                    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1794
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1795
#ifdef FAST_MEMCPY
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1796
                bcopy(srcp, dstp, count);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1797
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1798
                while (count-- > 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1799
                    *dstp++ = *srcp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1800
                }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1801
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1802
                RETURN (self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1803
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1804
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1805
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1806
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1807
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1808
    ^ super replaceFrom:start to:stop with:aString startingAt:repStart
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1809
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1810
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1811
replaceAll:oldCharacter by:newCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1812
    "replace all oldCharacters by newCharacter in the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1813
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1814
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1815
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1816
    REGISTER unsigned char *srcp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1817
    REGISTER unsigned oldVal, newVal;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1818
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1819
    if (_isCharacter(oldCharacter)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1820
     && _isCharacter(newCharacter)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1821
     && _isString(self)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1822
        srcp = (unsigned char *)_stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1823
        oldVal = _intVal(_characterVal(oldCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1824
        newVal = _intVal(_characterVal(newCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1825
        while (*srcp) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1826
            if (*srcp == oldVal)
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1827
                *srcp = newVal;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1828
            srcp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1829
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1830
        RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1831
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1832
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1833
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1834
    ^ super replaceAll:oldCharacter by:newCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1835
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1836
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1837
reverse                                                                         
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1838
    "in-place reverse the characters of the string"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1839
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1840
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1841
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1842
    REGISTER char c;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1843
    REGISTER unsigned char *hip, *lowp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1844
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1845
    if (_isString(self)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1846
        lowp = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1847
        hip = lowp + _stringSize(self) - 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1848
        while (lowp < hip) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1849
            c = *lowp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1850
            *lowp = *hip;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1851
            *hip = c;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1852
            lowp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1853
            hip--;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1854
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1855
        RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1856
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1857
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1858
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1859
    ^ super reverse
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1860
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1861
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1862
withCRs
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1863
    "return a copy of the receiver, where
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1864
     all \-characters are replaced by newline characters
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1865
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1866
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1867
    |newString|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1868
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1869
    OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1870
    REGISTER char c;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1871
    REGISTER unsigned char *srcp, *dstp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1872
    int len, offs;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1873
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1874
    len = _qSize(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1875
    if (_qClass(self) != String) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1876
        offs = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1877
        len -= offs;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1878
    } else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1879
        offs = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1880
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1881
    _qNew(newString, len, __context);
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1882
    if (newString != nil) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1883
        _InstPtr(newString)->o_class = String;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1884
        srcp = _stringVal(self) + offs;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1885
        dstp = _stringVal(newString);
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1886
        while (c = *srcp++)
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1887
            if (c == '\\')
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1888
                *dstp++ = '\n';
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1889
            else
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1890
                *dstp++ = c;
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1891
        *dstp++ = '\0';
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1892
        RETURN ( newString );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1893
    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1894
%}
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1895
.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1896
    ^ super withCRs
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1897
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1898
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1899
atAllPut:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1900
    "replace all characters with aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1901
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1902
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1903
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1904
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1905
    REGISTER int  byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1906
#ifndef FAST_MEMSET
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1907
    REGISTER unsigned char *dst;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1908
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1909
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1910
    if (_isCharacter(aCharacter) && _isString(self)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1911
        byteValue = _intVal(_characterVal(aCharacter));
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1912
#ifdef FAST_MEMSET
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1913
        memset(_stringVal(self), byteValue, _qSize(self) - OHDR_SIZE - 1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1914
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1915
        dst = _stringVal(self);
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1916
        while (*dst != '\0')
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1917
            *dst++ = byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1918
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1919
        RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1920
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1921
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1922
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1923
    ^ super atAllPut:aCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1924
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1925
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1926
withoutSpaces
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1927
    "return a copy of myself without leading and trailing spaces"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1928
42
e33491f6f260 *** empty log message ***
claus
parents: 41
diff changeset
  1929
    |startIndex "{ Class: SmallInteger }"
e33491f6f260 *** empty log message ***
claus
parents: 41
diff changeset
  1930
     endIndex   "{ Class: SmallInteger }" 
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1931
     sz blank|
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1932
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1933
%{
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1934
    REGISTER unsigned char *cp0;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1935
    REGISTER unsigned char *cp;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1936
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1937
    /* ignore instances of subclasses ... */
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1938
    if (_qClass(self) == String) {
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1939
	cp = cp0 = _stringVal(self);
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1940
	while (*cp == ' ') cp++;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1941
	startIndex = _MKSMALLINT(cp - cp0 + 1);
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1942
	cp = cp + strlen(cp) - 1;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1943
	while ((cp >= cp0) && (*cp == ' ')) cp--;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1944
	endIndex = _MKSMALLINT(cp - cp0 + 1);
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1945
    }
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1946
%}
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1947
.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1948
    sz := self size.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1949
    startIndex isNil ifTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1950
        startIndex := 1.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1951
        endIndex := sz.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1952
        blank := Character space.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1953
        [(startIndex < endIndex) and:[(self at:startIndex) == blank]] whileTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1954
            startIndex := startIndex + 1
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1955
        ].
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1956
        [(endIndex > 1) and:[(self at:endIndex) == blank]] whileTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1957
            endIndex := endIndex - 1
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1958
        ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1959
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1960
    startIndex > endIndex ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1961
        ^ ''
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1962
    ].
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1963
    ((startIndex == 1) and:[endIndex == sz]) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1964
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1965
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1966
    ^ self copyFrom:startIndex to:endIndex
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1967
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1968
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1969
withoutSeparators
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1970
    "return a copy of myself without leading and trailing whitespace"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1971
42
e33491f6f260 *** empty log message ***
claus
parents: 41
diff changeset
  1972
    |startIndex "{ Class: SmallInteger }"
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1973
     endIndex   "{ Class: SmallInteger }" 
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1974
     sz|
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1975
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1976
%{
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1977
    REGISTER unsigned char *cp0;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1978
    REGISTER unsigned char *cp;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1979
    REGISTER unsigned char c;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1980
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1981
    /* ignore instances of subclasses ... */
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1982
    if (_qClass(self) == String) {
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1983
        cp = cp0 = _stringVal(self);
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1984
	c = *cp;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1985
        while ((c == ' ') || (c == '\n') || (c == '\t')
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1986
                          || (c == '\r') || (c == '\f')) {
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1987
	    cp++;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1988
	    c = *cp;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1989
	}
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1990
        startIndex = _MKSMALLINT(cp - cp0 + 1);
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1991
        cp = cp + strlen(cp) - 1;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1992
        while ((cp >= cp0) && (*cp == ' ')) cp--;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1993
	c = *cp;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1994
        while ((cp >= cp0) &&
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1995
	       ((c == ' ') || (c == '\n') || (c == '\t')
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1996
                           || (c == '\r') || (c == '\f'))) {
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1997
	    cp--;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1998
	    c = *cp;
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  1999
	}
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2000
        endIndex = _MKSMALLINT(cp - cp0 + 1);
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2001
    }
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2002
%}
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2003
.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2004
    sz := self size.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2005
    startIndex isNil ifTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2006
        startIndex := 1.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2007
        endIndex := self size.
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2008
        [(startIndex < endIndex) and:[(self at:startIndex) isSeparator]] whileTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2009
            startIndex := startIndex + 1
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2010
        ].
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2011
        [(endIndex > 1) and:[(self at:endIndex) isSeparator]] whileTrue:[
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2012
            endIndex := endIndex - 1
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2013
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2014
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2015
    startIndex > endIndex ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2016
        ^ ''
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2017
    ].
51
9b7ae5e18f3e *** empty log message ***
claus
parents: 42
diff changeset
  2018
    ((startIndex == 1) and:[endIndex == sz]) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2019
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2020
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2021
    ^ self copyFrom:startIndex to:endIndex
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2022
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2023
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2024
!String methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2025
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2026
encoding
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2027
    "assume iso8859 encoding"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2028
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2029
    ^ #iso8859
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2030
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2031
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2032
knownAsSymbol
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2033
    "return true, if there is a symbol with same characters in the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2034
     system - use to check for existance of a symbol without creating one"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2035
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2036
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2037
    extern OBJ _KNOWNASSYMBOL();
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2038
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2039
    RETURN ( _KNOWNASSYMBOL(_stringVal(self)) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2040
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2041
! !