" Smalltalk/String.st -*- Smalltalk -*- " String : ByteArray () Object isString [^false] String isString [^true] String at: index [ ^Character value: (self byteAt: index) ] String at: index put: aCharacter [ self byteAt: index put: aCharacter asciiValue. ^aCharacter ] String compare: aString [ | chars len answer | chars := aString _stringValue. len := self size min: aString size. { struct t_String *this= (struct t_String *)self; int answer= memcmp((char *)this->_elements, (char *)v_chars, (size_t)_integerValue(v_len)); if (!answer) { struct t_String *other= (struct t_String *)v_aString; answer= (unsigned)this->size < (unsigned)other->size ? -1 : (this->size == other->size ? 0 : 1); } v_answer= _integerObject(answer); }. ^answer ] String hash [ ^self inject: 0 into: [ :hash :char | (hash bitAnd: 0x01ffffff) * 31 + char asciiValue ] ] String < aString [ ^(self compare: aString) < 0 ] String <= aString [ ^(self compare: aString) <= 0 ] String = aString [ ^(self compare: aString) = 0 ] String >= aString [ ^(self compare: aString) >= 0 ] String > aString [ ^(self compare: aString) > 0 ] String beginsWith: prefix [ " Answer whether the receiver begins with the given prefix string. The comparison is case-sensitive. " self size < prefix size ifTrue: [^false]. 0 to: prefix size - 1 do: [:index | (self at: index) == (prefix at: index) ifFalse: [^false]]. ^true ] String _cString { struct t_String *this= (struct t_String *)self; int size= _integerValue(this->size); char *elements= (char *)this->_elements; char *cString= (char *)_newBytes(size + 1); memcpy(cString, elements, size); cString[size]= '\0'; return (oop)cString; } String asByteArray [ | byteArray | byteArray := ByteArray new: self size. 0 to: self size - 1 do: [:index | byteArray at: index put: (self byteAt: index)]. ^byteArray ] String printOn: aStream [ aStream nextPut: $'; nextPutAll: self; nextPut: $' ] ImmutableString : String () ImmutableString at: index put: anObject [ ^self errorCannotModify ] ImmutableString species [ ^String ] " ---------------------------------------------------------------- " Integer hex2 [ ^(String new: 2) at: 0 put: (Character digitValue: self // 16 \\ 16); at: 1 put: (Character digitValue: self \\ 16); yourself ] Integer hex8 [ ^(String new: 8) at: 0 put: (Character digitValue: self // 0x10000000 \\ 16); at: 1 put: (Character digitValue: self // 0x01000000 \\ 16); at: 2 put: (Character digitValue: self // 0x00100000 \\ 16); at: 3 put: (Character digitValue: self // 0x00010000 \\ 16); at: 4 put: (Character digitValue: self // 0x00001000 \\ 16); at: 5 put: (Character digitValue: self // 0x00000100 \\ 16); at: 6 put: (Character digitValue: self // 0x00000010 \\ 16); at: 7 put: (Character digitValue: self \\ 16); yourself ] Integer octal3 [ ^(String new: 3) at: 0 put: (Character digitValue: self // 64 \\ 8); at: 1 put: (Character digitValue: self // 8 \\ 8); at: 2 put: (Character digitValue: self \\ 8); yourself ]