String.st
changeset 375 e5019c22f40e
parent 370 20f04d9b371b
child 379 5b5a130ccd09
equal deleted inserted replaced
374:7eb5bedfaa1c 375:e5019c22f40e
    19 
    19 
    20 String comment:'
    20 String comment:'
    21 COPYRIGHT (c) 1988 by Claus Gittinger
    21 COPYRIGHT (c) 1988 by Claus Gittinger
    22 	     All Rights Reserved
    22 	     All Rights Reserved
    23 
    23 
    24 $Header: /cvs/stx/stx/libbasic/String.st,v 1.40 1995-08-03 01:16:53 claus Exp $
    24 $Header: /cvs/stx/stx/libbasic/String.st,v 1.41 1995-08-08 00:49:12 claus Exp $
    25 '!
    25 '!
    26 
    26 
    27 !String class methodsFor:'documentation'!
    27 !String class methodsFor:'documentation'!
    28 
    28 
    29 copyright
    29 copyright
    40 "
    40 "
    41 !
    41 !
    42 
    42 
    43 version
    43 version
    44 "
    44 "
    45 $Header: /cvs/stx/stx/libbasic/String.st,v 1.40 1995-08-03 01:16:53 claus Exp $
    45 $Header: /cvs/stx/stx/libbasic/String.st,v 1.41 1995-08-08 00:49:12 claus Exp $
    46 "
    46 "
    47 !
    47 !
    48 
    48 
    49 documentation
    49 documentation
    50 "
    50 "
  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 
  1693 #endif
  1678 #endif
  1694 		    RETURN ( newString );
  1679 		    RETURN ( newString );
  1695 		}
  1680 		}
  1696 	    }
  1681 	    }
  1697 	}
  1682 	}
       
  1683 	/*
       
  1684 	 * allow empty copy
       
  1685 	 */
       
  1686 	if (index1 > index2) {
       
  1687 	    PROTECT_CONTEXT
       
  1688 	    _qNew(newString, OHDR_SIZE+1, SENDER);
       
  1689 	    UNPROTECT_CONTEXT
       
  1690 	    if (newString != nil) {
       
  1691 		_InstPtr(newString)->o_class = String;
       
  1692 		__stringVal(newString)[0] = '\0';
       
  1693 		RETURN ( newString );
       
  1694 	    }
       
  1695 	}
  1698     }
  1696     }
  1699 %}.
  1697 %}.
  1700     "fall back in case of non-integer index or out-of-bound index;
  1698     "fall back in case of non-integer index or out-of-bound index;
  1701      will eventually lead to an out-of-bound signal raise"
  1699      will eventually lead to an out-of-bound signal raise"
  1702 
  1700