1119 !String methodsFor:'pattern matching'! |
1119 !String methodsFor:'pattern matching'! |
1120 |
1120 |
1121 startsWith:aString |
1121 startsWith:aString |
1122 "return true, if the receiver starts with something, aString." |
1122 "return true, if the receiver starts with something, aString." |
1123 |
1123 |
1124 aString isString ifFalse: [ |
1124 %{ /* NOCONTEXT */ |
1125 (aString isMemberOf:Character) ifTrue:[ |
1125 |
1126 self isEmpty ifTrue:[^ false]. |
|
1127 ^ (self at:1) == aString |
|
1128 ]. |
|
1129 ^ super startsWith:aString |
|
1130 ]. |
|
1131 %{ |
|
1132 int len1, len2; |
1126 int len1, len2; |
1133 REGISTER unsigned char *src1, *src2; |
1127 REGISTER unsigned char *src1, *src2; |
1134 REGISTER OBJ s = aString; |
|
1135 OBJ cls; |
|
1136 char c; |
1128 char c; |
1137 |
1129 |
1138 len1 = __qSize(self); |
1130 if ((__isString(self) || __isSymbol(self)) |
1139 src1 = _stringVal(self); |
1131 && (__isString(aString) || __isSymbol(aString))) { |
1140 if ((cls = __qClass(self)) != String) { |
1132 len1 = __qSize(self); |
1141 int n = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars)); |
1133 len2 = __qSize(aString); |
1142 len1 -= n; |
1134 if (len1 < len2) { |
1143 src1 += n; |
|
1144 } |
|
1145 len2 = __qSize(s); |
|
1146 src2 = _stringVal(s); |
|
1147 if ((cls = __qClass(s)) != String) { |
|
1148 int n = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars)); |
|
1149 len2 -= n; |
|
1150 src2 += n; |
|
1151 } |
|
1152 if (len1 < len2) { |
|
1153 RETURN ( false ); |
|
1154 } |
|
1155 while (c = *src2++) |
|
1156 if (c != *src1++) { |
|
1157 RETURN ( false ); |
1135 RETURN ( false ); |
1158 } |
1136 } |
1159 %} |
1137 |
1160 . |
1138 src1 = _stringVal(self); |
1161 ^ true |
1139 src2 = _stringVal(aString); |
|
1140 while (c = *src2++) { |
|
1141 if (c != *src1++) { |
|
1142 RETURN ( false ); |
|
1143 } |
|
1144 } |
|
1145 RETURN (true); |
|
1146 } |
|
1147 %}. |
|
1148 (aString isMemberOf:Character) ifTrue:[ |
|
1149 self size == 0 ifTrue:[^ false]. |
|
1150 ^ (self at:1) == aString |
|
1151 ]. |
|
1152 ^ super startsWith:aString |
1162 |
1153 |
1163 " |
1154 " |
1164 'hello world' startsWith:'hello' |
1155 'hello world' startsWith:'hello' |
1165 'hello world' startsWith:'hi' |
1156 'hello world' startsWith:'hi' |
|
1157 'hello world' startsWith:$h |
|
1158 'hello world' startsWith:#($h $e $l) |
1166 " |
1159 " |
1167 ! |
1160 ! |
1168 |
1161 |
1169 endsWith:aString |
1162 endsWith:aString |
1170 "return true, if the receiver end with something, aString." |
1163 "return true, if the receiver end with something, aString." |
1171 |
1164 |
1172 aString isString ifFalse: [ |
1165 %{ /* NOCONTEXT */ |
1173 (aString isMemberOf:Character) ifTrue:[ |
1166 |
1174 self isEmpty ifTrue:[^ false]. |
|
1175 ^ (self at:(self size)) == aString |
|
1176 ]. |
|
1177 ^ super endsWith:aString |
|
1178 ]. |
|
1179 %{ |
|
1180 int len1, len2; |
1167 int len1, len2; |
1181 REGISTER unsigned char *src1, *src2; |
1168 REGISTER unsigned char *src1, *src2; |
1182 REGISTER OBJ s = aString; |
|
1183 OBJ cls; |
|
1184 char c; |
1169 char c; |
1185 |
1170 |
1186 len1 = __qSize(self); |
1171 if ((__isString(self) || __isSymbol(self)) |
1187 src1 = _stringVal(self); |
1172 && (__isString(aString) || __isSymbol(aString))) { |
1188 if ((cls = __qClass(self)) != String) { |
1173 len1 = __qSize(self); |
1189 int n = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars)); |
1174 len2 = __qSize(aString); |
1190 len1 -= n; |
1175 if (len1 < len2) { |
1191 src1 += n; |
|
1192 } |
|
1193 len2 = __qSize(s); |
|
1194 src2 = _stringVal(s); |
|
1195 if ((cls = __qClass(s)) != String) { |
|
1196 int n = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars)); |
|
1197 len2 -= n; |
|
1198 src2 += n; |
|
1199 } |
|
1200 if (len1 < len2) { |
|
1201 RETURN ( false ); |
|
1202 } |
|
1203 src1 = _stringVal(self) + len1 - len2; |
|
1204 src2 = _stringVal(aString); |
|
1205 while (c = *src2++) |
|
1206 if (c != *src1++) { |
|
1207 RETURN ( false ); |
1176 RETURN ( false ); |
1208 } |
1177 } |
1209 %}. |
1178 |
1210 ^ true |
1179 src1 = _stringVal(self) + len1 - len2; |
|
1180 src2 = _stringVal(aString); |
|
1181 while (c = *src2++) { |
|
1182 if (c != *src1++) { |
|
1183 RETURN ( false ); |
|
1184 } |
|
1185 } |
|
1186 RETURN (true); |
|
1187 } |
|
1188 %}. |
|
1189 (aString isMemberOf:Character) ifTrue:[ |
|
1190 self size == 0 ifTrue:[^ false]. |
|
1191 ^ (self at:(self size)) == aString |
|
1192 ]. |
|
1193 ^ super endsWith:aString |
1211 |
1194 |
1212 " |
1195 " |
1213 'hello world' endsWith:'world' |
1196 'hello world' endsWith:'world' |
1214 'hello world' endsWith:'earth' |
1197 'hello world' endsWith:'earth' |
|
1198 'hello world' endsWith:$d |
|
1199 'hello world' endsWith:#($r $l $d) |
1215 " |
1200 " |
1216 ! ! |
1201 ! ! |
1217 |
1202 |
1218 !String methodsFor:'testing'! |
1203 !String methodsFor:'testing'! |
1219 |
1204 |