--- a/AbstractOperatingSystem.st Fri Dec 23 13:41:34 2011 +0000
+++ b/AbstractOperatingSystem.st Fri Jan 06 08:53:28 2012 +0000
@@ -5414,6 +5414,50 @@
aBlock value:hours value:minutes value:seconds value:millis
!
+getCPUCycleCount
+ "get a CPU specific cycle counter value.
+ Can be used for exact timing & performance measurements.
+ Notice, that the # of cycles has to be multiplied by the cycle time (1/cpu-frequency).
+
+ For x86:
+ the CPU cycle count register value is returned (RDTSC instruction).
+ Fails if RDTSC instruction is not supported (which is unlikely, nowadays).
+ For others:
+ currently fails"
+
+%{ /* NOCONTEXT */
+ unsigned int low, high;
+
+#ifdef i386
+ // use RDTSC instruction (retrieves 64bit cycle count; hi in EDX, lo in EAX)
+
+# if defined(__BORLANDC__)
+ _asm { push edx };
+ __emit__(0x0F,0x31); /* RDTSC instruction */
+ _asm { mov low,eax };
+ _asm { mov high,edx };
+ _asm { pop edx };
+# elif defined(_MSC_VER)
+ _asm { push edx };
+ _asm { _emit 0fh }; _asm { _emit 031h };
+ _asm { mov low,eax };
+ _asm { mov high,edx };
+ _asm { pop edx };
+# elif defined(__MINGW_H) || defined(__GNUC__)
+ asm volatile("rdtsc" : "=a"(low), "=d"(high));
+# else
+ goto unsupported;
+# endif
+#endif /* i386 */
+
+ RETURN ( __MKLARGEINT64(1, low, high) );
+unsupported: ;
+%}.
+ self primitiveFailed:'no CPU cycle register on this architecture'
+
+ "Created: / 05-01-2012 / 13:23:31 / cg"
+!
+
getMicrosecondTime
"This returns the microsecond timers value - if available.
On some machines, times with this precision may not be available,
@@ -7058,16 +7102,17 @@
!AbstractOperatingSystem class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/AbstractOperatingSystem.st,v 1.215 2011/10/27 16:31:24 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/AbstractOperatingSystem.st,v 1.216 2012/01/05 13:08:45 cg Exp $'
!
version_CVS
- ^ 'Header: /cvs/stx/stx/libbasic/AbstractOperatingSystem.st,v 1.215 2011/10/27 16:31:24 stefan Exp '
+ ^ 'Header: /cvs/stx/stx/libbasic/AbstractOperatingSystem.st,v 1.216 2012/01/05 13:08:45 cg Exp '
!
version_SVN
- ^ '$Id: AbstractOperatingSystem.st 10729 2011-10-31 22:19:21Z vranyj1 $'
+ ^ '$Id: AbstractOperatingSystem.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
AbstractOperatingSystem initialize!
+
--- a/ApplicationDefinition.st Fri Dec 23 13:41:34 2011 +0000
+++ b/ApplicationDefinition.st Fri Jan 06 08:53:28 2012 +0000
@@ -2122,7 +2122,7 @@
all:: prereq exe
LIBNAME=%(LIBRARY_NAME)
-STCLOCALOPT=''-package=$(PACKAGE)'' -I. --headerDir=. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) %(HEADEROUTPUTARG) %(COMMONSYMFLAG) -varPrefix=$(LIBNAME)
+STCLOCALOPT=''-package=$(PACKAGE)'' -I. -headerDir=. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) %(HEADEROUTPUTARG) %(COMMONSYMFLAG) -varPrefix=$(LIBNAME)
# ********** OPTIONAL: MODIFY the next line ***
@@ -2212,7 +2212,7 @@
"Modified: / 09-08-2006 / 16:50:23 / fm"
"Created: / 29-09-2006 / 23:47:07 / cg"
"Modified: / 24-06-2009 / 21:40:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 06-12-2011 / 21:24:50 / cg"
+ "Modified: / 23-12-2011 / 15:07:38 / cg"
!
make_dot_proto_app_source_rules
@@ -2836,15 +2836,16 @@
!ApplicationDefinition class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/ApplicationDefinition.st,v 1.187 2011/12/06 20:28:11 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/ApplicationDefinition.st,v 1.188 2011/12/23 14:09:06 cg Exp $'
!
version_CVS
- ^ 'Header: /cvs/stx/stx/libbasic/ApplicationDefinition.st,v 1.187 2011/12/06 20:28:11 cg Exp '
+ ^ 'Header: /cvs/stx/stx/libbasic/ApplicationDefinition.st,v 1.188 2011/12/23 14:09:06 cg Exp '
!
version_SVN
- ^ '$Id: ApplicationDefinition.st 10751 2011-12-21 22:04:49Z vranyj1 $'
+ ^ '$Id: ApplicationDefinition.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/CharacterArray.st Fri Dec 23 13:41:34 2011 +0000
+++ b/CharacterArray.st Fri Jan 06 08:53:28 2012 +0000
@@ -364,160 +364,160 @@
"/ Transcript showCR:('match: ''' , (aString copyFrom:sStart to:sStop) ,
"/ ''' against:' , (matchScanArray copyFrom:mStart to:mStop) printString).
- mSize := mStop - mStart + 1.
- sSize := sStop - sStart + 1.
-
- "empty strings match"
- (mSize == 0) ifTrue:[^ (sSize == 0)].
-
- matchEntry := matchScanArray at:mStart.
-
- "/ the most common case first:
- (sSize ~~ 0
- and:[(checkChar := (aString at:sStart)) = matchEntry]) ifTrue:[
- "advance by one and continue"
- mStart := mStart + 1.
- sStart := sStart + 1
- ] ifFalse:[
- (matchEntry == #any) ifTrue:[
- "restString empty -> no match"
- (sSize == 0) ifTrue:[^ false].
- "# matches single character"
- ((sSize == 1) and:[mSize == 1]) ifTrue:[^ true].
- "advance by one and continue"
- mStart := mStart + 1.
- sStart := sStart + 1
- ] ifFalse:[
- (matchEntry == #anyString) ifTrue:[
- "* alone matches anything"
- (mSize == 1) ifTrue:[^ true].
- "restString empty & matchString not empty -> no match"
- (sSize == 0) ifTrue:[^ false].
-
- "
- try to avoid some of the recursion by checking last
- character and continue with shortened strings if possible
- "
- quickCheck := false.
- (mStop >= mStart) ifTrue:[
- matchLast := matchScanArray at:mStop.
- (matchLast ~~ #anyString) ifTrue:[
- (matchLast == #any) ifTrue:[
- quickCheck := true
- ] ifFalse:[
- matchLast == (aString at:sStop) ifTrue:[
- quickCheck := true
- ] ifFalse:[
- matchLast isString ifTrue:[
- quickCheck := matchLast includes:(aString at:sStop)
- ]
- ]
- ]
- ]
- ].
- quickCheck ifTrue:[
- "
- quickCheck ok, advance from the right
- "
- mStop := mStop - 1.
- sStop := sStop - 1
- ] ifFalse:[
- "/ no quick check;
- "/ look for the next character(s)
- "/ and try matching there
- "/ (to avoid recursion)
-
- mStart < mStop ifTrue:[
- nextMatchEntry := matchScanArray at:mStart+1.
- nextMatchEntry isCharacter ifTrue:[
- sStart <= sStop ifTrue:[
- [true] whileTrue:[
- ignoreCase ifFalse:[
- index := aString indexOf:nextMatchEntry startingAt:sStart
- ] ifTrue:[
- index := aString findFirst:[:c | c asLowercase = nextMatchEntry asLowercase]
- startingAt:sStart.
- ].
- (index == 0 or:[index > sStop]) ifTrue:[
- ^ false
- ].
- (self matchScan:matchScanArray
- from:(mStart + 1)
- to:mStop
- with:aString
- from:index
- to:sStop
- ignoreCase:ignoreCase
- ) ifTrue:[
- ^ true
- ].
- sStart := index + 1.
- ]
- ]
- ]
- ].
-
- "
- no quick check possible;
- loop over all possible substrings
- "
- index := sStart.
- [index <= sStop] whileTrue:[
- (self matchScan:matchScanArray
- from:(mStart + 1)
- to:mStop
- with:aString
- from:index
- to:sStop
- ignoreCase:ignoreCase
- ) ifTrue:[
- ^ true
- ].
- index := index + 1
- ].
- ^ false
- ].
- ] ifFalse:[
- (matchEntry isString) ifTrue:[
- "testString empty -> no match"
- (sSize == 0) ifTrue:[^ false].
-
- included := false.
- "/ checkChar := aString at:sStart.
- included := matchEntry includes:checkChar.
- included ifFalse:[
- ignoreCase ifTrue:[
- checkChar isUppercase ifTrue:[
- included := matchEntry includes:checkChar asLowercase.
- ] ifFalse:[
- included := matchEntry includes:checkChar asUppercase.
- ]
- ].
- ].
- mStart := mStart + 1.
- mSize := mSize - 1.
- included ifFalse:[^ false].
-
- ((sSize == 1) and:[mSize == 0]) ifTrue:[^ true].
- ] ifFalse:[
- "/ must be single character
-
- "testString empty ?"
- (sSize == 0) ifTrue:[^ false].
-
- "first characters equal ?"
- "/ checkChar := aString at:sStart.
- ignoreCase ifFalse:[^ false].
- (checkChar asUppercase ~= matchEntry asUppercase) ifTrue:[^ false].
-
- "advance and continue"
- mStart := mStart + 1.
- ].
- "cut off 1st char and continue"
- sStart := sStart + 1
- ]
- ]
- ]
+ mSize := mStop - mStart + 1.
+ sSize := sStop - sStart + 1.
+
+ "empty strings match"
+ (mSize == 0) ifTrue:[^ (sSize == 0)].
+
+ matchEntry := matchScanArray at:mStart.
+
+ "/ the most common case first:
+ (sSize ~~ 0
+ and:[(checkChar := (aString at:sStart)) = matchEntry]) ifTrue:[
+ "advance by one and continue"
+ mStart := mStart + 1.
+ sStart := sStart + 1
+ ] ifFalse:[
+ (matchEntry == #any) ifTrue:[
+ "restString empty -> no match"
+ (sSize == 0) ifTrue:[^ false].
+ "# matches single character"
+ ((sSize == 1) and:[mSize == 1]) ifTrue:[^ true].
+ "advance by one and continue"
+ mStart := mStart + 1.
+ sStart := sStart + 1
+ ] ifFalse:[
+ (matchEntry == #anyString) ifTrue:[
+ "* alone matches anything"
+ (mSize == 1) ifTrue:[^ true].
+ "restString empty & matchString not empty -> no match"
+ (sSize == 0) ifTrue:[^ false].
+
+ "
+ try to avoid some of the recursion by checking last
+ character and continue with shortened strings if possible
+ "
+ quickCheck := false.
+ (mStop >= mStart) ifTrue:[
+ matchLast := matchScanArray at:mStop.
+ (matchLast ~~ #anyString) ifTrue:[
+ (matchLast == #any) ifTrue:[
+ quickCheck := true
+ ] ifFalse:[
+ matchLast == (aString at:sStop) ifTrue:[
+ quickCheck := true
+ ] ifFalse:[
+ matchLast isString ifTrue:[
+ quickCheck := matchLast includes:(aString at:sStop)
+ ]
+ ]
+ ]
+ ]
+ ].
+ quickCheck ifTrue:[
+ "
+ quickCheck ok, advance from the right
+ "
+ mStop := mStop - 1.
+ sStop := sStop - 1
+ ] ifFalse:[
+ "/ no quick check;
+ "/ look for the next character(s)
+ "/ and try matching there
+ "/ (to avoid recursion)
+
+ mStart < mStop ifTrue:[
+ nextMatchEntry := matchScanArray at:mStart+1.
+ nextMatchEntry isCharacter ifTrue:[
+ sStart <= sStop ifTrue:[
+ [true] whileTrue:[
+ ignoreCase ifFalse:[
+ index := aString indexOf:nextMatchEntry startingAt:sStart
+ ] ifTrue:[
+ index := aString findFirst:[:c | c asLowercase = nextMatchEntry asLowercase]
+ startingAt:sStart.
+ ].
+ (index == 0 or:[index > sStop]) ifTrue:[
+ ^ false
+ ].
+ (self matchScan:matchScanArray
+ from:(mStart + 1)
+ to:mStop
+ with:aString
+ from:index
+ to:sStop
+ ignoreCase:ignoreCase
+ ) ifTrue:[
+ ^ true
+ ].
+ sStart := index + 1.
+ ]
+ ]
+ ]
+ ].
+
+ "
+ no quick check possible;
+ loop over all possible substrings
+ "
+ index := sStart.
+ [index <= sStop] whileTrue:[
+ (self matchScan:matchScanArray
+ from:(mStart + 1)
+ to:mStop
+ with:aString
+ from:index
+ to:sStop
+ ignoreCase:ignoreCase
+ ) ifTrue:[
+ ^ true
+ ].
+ index := index + 1
+ ].
+ ^ false
+ ].
+ ] ifFalse:[
+ (matchEntry isString) ifTrue:[
+ "testString empty -> no match"
+ (sSize == 0) ifTrue:[^ false].
+
+ included := false.
+ "/ checkChar := aString at:sStart.
+ included := matchEntry includes:checkChar.
+ included ifFalse:[
+ ignoreCase ifTrue:[
+ checkChar isUppercase ifTrue:[
+ included := matchEntry includes:checkChar asLowercase.
+ ] ifFalse:[
+ included := matchEntry includes:checkChar asUppercase.
+ ]
+ ].
+ ].
+ mStart := mStart + 1.
+ mSize := mSize - 1.
+ included ifFalse:[^ false].
+
+ ((sSize == 1) and:[mSize == 0]) ifTrue:[^ true].
+ ] ifFalse:[
+ "/ must be single character
+
+ "testString empty ?"
+ (sSize == 0) ifTrue:[^ false].
+
+ "first characters equal ?"
+ "/ checkChar := aString at:sStart.
+ ignoreCase ifFalse:[^ false].
+ (checkChar asUppercase ~= matchEntry asUppercase) ifTrue:[^ false].
+
+ "advance and continue"
+ mStart := mStart + 1.
+ ].
+ "cut off 1st char and continue"
+ sStart := sStart + 1
+ ]
+ ]
+ ]
].
"
@@ -526,13 +526,13 @@
scanArray := self matchScanArrayFrom:'*hello'.
s := 'foo bar hello world'.
CharacterArray
- matchScan:scanArray
- from:1
- to:scanArray size
- with:s
- from:1
- to:s size
- ignoreCase:false
+ matchScan:scanArray
+ from:1
+ to:scanArray size
+ with:s
+ from:1
+ to:s size
+ ignoreCase:false
"
"
|scanArray s|
@@ -540,13 +540,13 @@
scanArray := self matchScanArrayFrom:'*hello*'.
s := 'foo bar hello world'.
CharacterArray
- matchScan:scanArray
- from:1
- to:scanArray size
- with:s
- from:1
- to:s size
- ignoreCase:false
+ matchScan:scanArray
+ from:1
+ to:scanArray size
+ with:s
+ from:1
+ to:s size
+ ignoreCase:false
"
"Modified: / 24-07-2011 / 07:17:03 / cg"
@@ -677,7 +677,6 @@
^ self == CharacterArray
! !
-
!CharacterArray methodsFor:'Compatibility-ANSI'!
addLineDelimiters
@@ -942,9 +941,9 @@
"cg: I am not sure, if this is really the squeak semantics (w.r.t. empty fields)"
delimiterOrDelimiters size == 0 ifTrue:[
- ^ self asCollectionOfSubstringsSeparatedBy:delimiterOrDelimiters
+ ^ self asCollectionOfSubstringsSeparatedBy:delimiterOrDelimiters
] ifFalse:[
- ^ self asCollectionOfSubstringsSeparatedByAny:delimiterOrDelimiters
+ ^ self asCollectionOfSubstringsSeparatedByAny:delimiterOrDelimiters
].
"
@@ -1133,7 +1132,7 @@
!
withSqueakLineEndings
- "assume the string is textual, and that CR, LF, and CRLF are all
+ "assume the string is textual, and that CR, LF, and CRLF are all
valid line endings. Replace each occurence with a single CR"
^ self asStringCollection asStringWith:Character cr.
@@ -1146,14 +1145,14 @@
^ self withoutLeadingForWhich:[:ch | ch = char]
"
- '****foo****' withoutLeading: $*
- 'foo****' withoutLeading: $*
- '*' withoutLeading: $*
- '' withoutLeading: $*
- '****foo' withoutLeading: $*
- '*******' withoutLeading: $*
- 'foo' withoutLeading: $*
- 'f***o***o' withoutLeading: $*
+ '****foo****' withoutLeading: $*
+ 'foo****' withoutLeading: $*
+ '*' withoutLeading: $*
+ '' withoutLeading: $*
+ '****foo' withoutLeading: $*
+ '*******' withoutLeading: $*
+ 'foo' withoutLeading: $*
+ 'f***o***o' withoutLeading: $*
('**' , Character tab asString , '*foo***') withoutLeading: $* inspect
"
!
@@ -1165,11 +1164,11 @@
^ self withoutTrailingForWhich:[:ch | ch = char]
"
- ' foo....' withoutTrailing:$.
- 'foo....' withoutTrailing:$.
- ' foo' withoutTrailing:$.
- '.......' withoutTrailing:$.
- 'foo' withoutTrailing:$.
+ ' foo....' withoutTrailing:$.
+ 'foo....' withoutTrailing:$.
+ ' foo' withoutTrailing:$.
+ '.......' withoutTrailing:$.
+ 'foo' withoutTrailing:$.
"
!
@@ -1292,10 +1291,10 @@
"
'do you prefer %1 or rather %2 (not talking about %3) ?'
- bindWithArguments:#('smalltalk' 'c++' 'c')
+ bindWithArguments:#('smalltalk' 'c++' 'c')
'do you %(what) ?'
- bindWithArguments:(Dictionary new at:#'what' put:'understand'; yourself)
+ bindWithArguments:(Dictionary new at:#'what' put:'understand'; yourself)
"
!
@@ -1900,10 +1899,10 @@
|s|
(s := self string) ~~ self ifTrue:[
- ^ s endsWith:aStringOrCharacter
+ ^ s endsWith:aStringOrCharacter
].
(self notEmpty and:[aStringOrCharacter isCharacter]) ifTrue:[
- ^ self last = aStringOrCharacter
+ ^ self last = aStringOrCharacter
].
^ super endsWith:aStringOrCharacter
@@ -1933,6 +1932,28 @@
hash
"return an integer useful as a hash-key"
+ "/ immediately after any change, execute (maybe in a debugger):
+ "/ Set allSubInstancesDo:[:s | s rehash]
+ ^ self hash_dragonBook
+ "/ ^ self hash_sdbm.
+
+ "
+ 'a' hash
+ 'a' asUnicode16String hash
+ 'aa' hash
+ 'aa' asUnicode16String hash
+ 'ab' hash
+ 'ab' asUnicode16String hash
+ 'ab' hash
+ 'ab' asArray hash
+ "
+
+ "Modified: / 26-12-2011 / 14:09:07 / cg"
+!
+
+hash_dragonBook
+ "return an integer useful as a hash-key"
+
|h g|
"/
@@ -1969,6 +1990,32 @@
'ab' hash
'ab' asArray hash
"
+
+ "Created: / 26-12-2011 / 13:46:06 / cg"
+!
+
+hash_sdbm
+ "return an integer useful as a hash-key"
+
+ |h|
+
+ "/
+ "/ this is the sdbm algorithm
+ "/
+ h := 0.
+ self do:[:char |
+ h := (h * 65599) + char codePoint.
+ h := h bitAnd:16r3FFFFFFF.
+ ].
+ ^ h
+
+ "
+ 'a' hash_sdbm
+ 'aa' hash_sdbm
+ 'ab' hash_sdbm
+ "
+
+ "Created: / 26-12-2011 / 13:48:13 / cg"
!
levenshteinTo:aString
@@ -2280,8 +2327,8 @@
|bytes sz bytesPerCharacter idx|
self string ~~ self ifTrue:[
- "/ for text and other wrappers
- ^ self string asByteArray
+ "/ for text and other wrappers
+ ^ self string asByteArray
].
"/ for real strings, a fallback
@@ -2290,19 +2337,19 @@
bytes := ByteArray new:(sz * bytesPerCharacter).
idx := 1.
self do:[:char |
- |code|
-
- code := char codePoint.
- bytesPerCharacter == 2 ifTrue:[
- bytes unsignedShortAt:idx put:code
- ] ifFalse:[
- bytesPerCharacter == 4 ifTrue:[
- bytes unsignedLongAt:idx put:code
- ] ifFalse:[
- bytes at:idx put:code
- ].
- ].
- idx := idx + bytesPerCharacter.
+ |code|
+
+ code := char codePoint.
+ bytesPerCharacter == 2 ifTrue:[
+ bytes unsignedShortAt:idx put:code
+ ] ifFalse:[
+ bytesPerCharacter == 4 ifTrue:[
+ bytes unsignedLongAt:idx put:code
+ ] ifFalse:[
+ bytes at:idx put:code
+ ].
+ ].
+ idx := idx + bytesPerCharacter.
].
^ bytes
@@ -2388,64 +2435,64 @@
|aTextSeparatorChar items scanningWord inStream element lastIsFieldSeparator sz|
aTextSeparatorOrNil isNil ifTrue:[
- ^ self asCollectionOfSubstringsSeparatedByAll: aFieldSeparatorString
+ ^ self asCollectionOfSubstringsSeparatedByAll: aFieldSeparatorString
].
sz := aTextSeparatorOrNil size.
sz = 0 ifTrue:[
- aTextSeparatorChar := aTextSeparatorOrNil
+ aTextSeparatorChar := aTextSeparatorOrNil
] ifFalse:[sz = 1 ifTrue:[
- "this is a String. Fetch the first character - compatibility to older expecco libs"
- aTextSeparatorChar := aTextSeparatorOrNil first.
+ "this is a String. Fetch the first character - compatibility to older expecco libs"
+ aTextSeparatorChar := aTextSeparatorOrNil first.
] ifFalse:[
- self error:'textSeparatoSize > 1'.
+ self error:'textSeparatoSize > 1'.
]].
items := OrderedCollection new.
inStream := ReadStream on:self.
- [
- inStream skipSeparators.
- inStream atEnd
+ [
+ inStream skipSeparators.
+ inStream atEnd
] whileFalse:[
- lastIsFieldSeparator := false.
- inStream peek == aTextSeparatorChar ifTrue:[
- inStream next.
- element := ''.
- scanningWord := true.
- [ inStream atEnd not and:[scanningWord] ] whileTrue:[
- element := element , (inStream upTo:aTextSeparatorChar).
- (inStream peek == aTextSeparatorChar) ifTrue:[
- element := element , aTextSeparatorChar .
- inStream next.
- ] ifFalse:[
- scanningWord := false.
- ].
- ].
- inStream upToAll:aFieldSeparatorString.
- ] ifFalse:[
- element := inStream upToAll:aFieldSeparatorString
- ].
- items add:element.
- lastIsFieldSeparator := (inStream skipThroughAll:aFieldSeparatorString) notNil.
+ lastIsFieldSeparator := false.
+ inStream peek == aTextSeparatorChar ifTrue:[
+ inStream next.
+ element := ''.
+ scanningWord := true.
+ [ inStream atEnd not and:[scanningWord] ] whileTrue:[
+ element := element , (inStream upTo:aTextSeparatorChar).
+ (inStream peek == aTextSeparatorChar) ifTrue:[
+ element := element , aTextSeparatorChar .
+ inStream next.
+ ] ifFalse:[
+ scanningWord := false.
+ ].
+ ].
+ inStream upToAll:aFieldSeparatorString.
+ ] ifFalse:[
+ element := inStream upToAll:aFieldSeparatorString
+ ].
+ items add:element.
+ lastIsFieldSeparator := (inStream skipThroughAll:aFieldSeparatorString) notNil.
].
lastIsFieldSeparator ifTrue:[
- "empty element at the end of the line"
- items add:''.
+ "empty element at the end of the line"
+ items add:''.
].
^ items
"
self assert:(('#First#, #Second,SecondAdd#, #Third#' asCollectionOfSubstringsSeparatedBy:',' textSeparator: $#)
- sameContentsAs:#('First' 'Second,SecondAdd' 'Third')).
+ sameContentsAs:#('First' 'Second,SecondAdd' 'Third')).
self assert:(('#Fir##st#, #Second,SecondAdd#, #Third#' asCollectionOfSubstringsSeparatedBy:',' textSeparator: $#)
- sameContentsAs:#('Fir#st' 'Second,SecondAdd' 'Third')).
+ sameContentsAs:#('Fir#st' 'Second,SecondAdd' 'Third')).
self assert:(('#Fir##st#, Second,SecondAdd, #Third#' asCollectionOfSubstringsSeparatedBy:',' textSeparator: $#)
- sameContentsAs:#('Fir#st' 'Second' 'SecondAdd' 'Third')).
+ sameContentsAs:#('Fir#st' 'Second' 'SecondAdd' 'Third')).
self assert:(('First,Second,Third,,' asCollectionOfSubstringsSeparatedBy:',' textSeparator:nil)
- sameContentsAs:#('First' 'Second' 'Third' '' '')).
+ sameContentsAs:#('First' 'Second' 'Third' '' '')).
self assert:(('First,Second,Third,,' asCollectionOfSubstringsSeparatedBy:',' textSeparator:'#')
- sameContentsAs:#('First' 'Second' 'Third' '' '')).
+ sameContentsAs:#('First' 'Second' 'Third' '' '')).
"
"Modified: / 07-04-2011 / 13:23:19 / cg"
@@ -3024,15 +3071,15 @@
|newString firstChar firstCharAsUppercase|
self isEmpty ifTrue:[^ self].
- firstChar := self at:1.
+ firstChar := self at:1.
firstCharAsUppercase := firstChar asUppercase.
firstChar == firstCharAsUppercase ifTrue:[ ^ self].
"/ very seldom, the uppercase-char needs more bits than the lowercase one (turkish y-diaresis)
firstCharAsUppercase bitsPerCharacter > self bitsPerCharacter ifTrue:[
- newString := firstCharAsUppercase stringSpecies fromString:self.
+ newString := firstCharAsUppercase stringSpecies fromString:self.
] ifFalse:[
- newString := self stringSpecies fromString:self.
+ newString := self stringSpecies fromString:self.
].
newString at:1 put:firstCharAsUppercase.
^ newString
@@ -3309,16 +3356,16 @@
^ (self copyTo:leftSize),'...',(self copyFrom:(sz+1-rightSize))
"
- '12345678901234' contractTo:15
- '123456789012345' contractTo:15
- '1234567890123456' contractTo:15
- '12345678901234567' contractTo:15
- '123456789012345678' contractTo:15
- 'aShortString' contractTo:15
+ '12345678901234' contractTo:15
+ '123456789012345' contractTo:15
+ '1234567890123456' contractTo:15
+ '12345678901234567' contractTo:15
+ '123456789012345678' contractTo:15
+ 'aShortString' contractTo:15
'aVeryLongNameForAStringThatShouldBeShortened' contractTo:15
'C:\Dokumente und Einstellungen\cg\work\bosch\dapas\hw_schnittstellen\DAPAS__HpibDLL.st' contractTo:40
- ('1234567890123456789012345678901234567' contractTo:30) size
- ('1234567890123456789012345678901234567' contractTo:29) size
+ ('1234567890123456789012345678901234567' contractTo:30) size
+ ('1234567890123456789012345678901234567' contractTo:29) size
"
"Modified (comment): / 24-11-2011 / 19:17:46 / cg"
@@ -3776,7 +3823,7 @@
This is usable with fileName pattern fields.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -3801,7 +3848,7 @@
This is usable with fileName pattern fields.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -3809,7 +3856,7 @@
matchers := self asCollectionOfSubstringsSeparatedBy:$;.
^ matchers contains:[:aPattern |
- aPattern match:aString ignoreCase:ignoreCase escapeCharacter:nil
+ aPattern match:aString ignoreCase:ignoreCase escapeCharacter:nil
].
"/ matchers do:[:aPattern |
@@ -3840,7 +3887,7 @@
if not found, return 0.
NOTICE: match-meta character interpretation is like in unix-matching,
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the argument is the match pattern"
@@ -3853,7 +3900,7 @@
if not found, return 0.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the argument is the match pattern"
@@ -3867,7 +3914,7 @@
This is a q&d hack - not very efficient.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the argument is the match pattern"
@@ -3882,40 +3929,40 @@
realMatchString := matchString.
(realMatchString endsWith:$*) ifFalse:[
- realMatchString := realMatchString , '*'.
- matchSize := matchSize + 1
+ realMatchString := realMatchString , '*'.
+ matchSize := matchSize + 1
].
mySize := self size.
firstChar := realMatchString at:1.
firstChar == self class matchEscapeCharacter ifTrue:[
- firstChar := realMatchString at:2.
+ firstChar := realMatchString at:2.
].
firstChar asString includesMatchCharacters ifTrue:[
- index to:mySize do:[:col |
- (realMatchString match:self from:col to:mySize ignoreCase:ignoreCase)
- ifTrue:[^ col]
- ].
- ^ exceptionBlock value.
+ index to:mySize do:[:col |
+ (realMatchString match:self from:col to:mySize ignoreCase:ignoreCase)
+ ifTrue:[^ col]
+ ].
+ ^ exceptionBlock value.
].
lcChar := firstChar asLowercase.
ucChar := firstChar asUppercase.
(ignoreCase and:[ lcChar ~= ucChar]) ifTrue:[
- firstSet := Array with:ucChar with:lcChar.
- startIndex := self indexOfAny:firstSet startingAt:index.
+ firstSet := Array with:ucChar with:lcChar.
+ startIndex := self indexOfAny:firstSet startingAt:index.
] ifFalse:[
- startIndex := self indexOf:firstChar startingAt:index.
+ startIndex := self indexOf:firstChar startingAt:index.
].
[startIndex == 0] whileFalse:[
- (realMatchString match:self from:startIndex to:mySize ignoreCase:ignoreCase)
- ifTrue:[^ startIndex].
- firstSet notNil ifTrue:[
- startIndex := self indexOfAny:firstSet startingAt:(startIndex + 1).
- ] ifFalse:[
- startIndex := self indexOf:firstChar startingAt:(startIndex + 1).
- ].
+ (realMatchString match:self from:startIndex to:mySize ignoreCase:ignoreCase)
+ ifTrue:[^ startIndex].
+ firstSet notNil ifTrue:[
+ startIndex := self indexOfAny:firstSet startingAt:(startIndex + 1).
+ ] ifFalse:[
+ startIndex := self indexOf:firstChar startingAt:(startIndex + 1).
+ ].
].
^ exceptionBlock value
@@ -3933,7 +3980,7 @@
find matchstring; if found, return true, otherwise return false.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the argument is the match pattern"
@@ -3952,7 +3999,7 @@
find matchstring; if found, return true, otherwise return false.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the argument is the match pattern"
@@ -3983,7 +4030,7 @@
The escape character is the backQuote.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -4015,7 +4062,7 @@
Lower/uppercase are considered different.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -4036,13 +4083,13 @@
The escape character is the backQuote.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
^ self
- match:aString from:start to:stop ignoreCase:ignoreCase
- escapeCharacter:(self class matchEscapeCharacter)
+ match:aString from:start to:stop ignoreCase:ignoreCase
+ escapeCharacter:(self class matchEscapeCharacter)
"
'*ute*' match:'12345COMPUTER' from:1 to:5 ignoreCase:true
@@ -4060,7 +4107,7 @@
If ignoreCase is true, lower/uppercase are considered the same.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -4073,23 +4120,23 @@
"
(PreviousMatch notNil
and:[PreviousMatch key = self]) ifTrue:[
- matchScanArray := PreviousMatch value
+ matchScanArray := PreviousMatch value
] ifFalse:[
- matchScanArray := self class matchScanArrayFrom:self escapeCharacter:escape.
- matchScanArray isNil ifTrue:[
- 'CharacterArray [info]: invalid matchpattern:''' infoPrint. self infoPrint. ''' comparing for equality.' infoPrintCR.
- ^ self = aString
+ matchScanArray := self class matchScanArrayFrom:self escapeCharacter:escape.
+ matchScanArray isNil ifTrue:[
+ 'CharacterArray [info]: invalid matchpattern:''' infoPrint. self infoPrint. ''' comparing for equality.' infoPrintCR.
+ ^ self = aString
"/ ^ false
- ].
- PreviousMatch := self -> matchScanArray.
+ ].
+ PreviousMatch := self -> matchScanArray.
].
^ self class
- matchScan:matchScanArray
- from:1 to:matchScanArray size
- with:aString
- from:start to:stop
- ignoreCase:ignoreCase
+ matchScan:matchScanArray
+ from:1 to:matchScanArray size
+ with:aString
+ from:start to:stop
+ ignoreCase:ignoreCase
"
'*ute*' match:'12345COMPUTER' from:1 to:5 ignoreCase:true
@@ -4107,7 +4154,7 @@
The escape character is the backQuote.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -4126,14 +4173,14 @@
'*some*compl*ern*' match:'this is another complicated pattern match' ignoreCase:true
Time millisecondsToRun:[
- Symbol allInstancesDo:[:sym |
- '[ab]*' match:sym ignoreCase:false
- ]
+ Symbol allInstancesDo:[:sym |
+ '[ab]*' match:sym ignoreCase:false
+ ]
].
Time millisecondsToRun:[
- Symbol allInstancesDo:[:sym |
- '*at:*' match:sym ignoreCase:false
- ]
+ Symbol allInstancesDo:[:sym |
+ '*at:*' match:sym ignoreCase:false
+ ]
].
"
@@ -4147,7 +4194,7 @@
If ignoreCase is true, lower/uppercase are considered the same.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -4166,14 +4213,14 @@
'*some*compl*ern*' match:'this is another complicated pattern match' ignoreCase:true
Time millisecondsToRun:[
- Symbol allInstancesDo:[:sym |
- '[ab]*' match:sym ignoreCase:false
- ]
+ Symbol allInstancesDo:[:sym |
+ '[ab]*' match:sym ignoreCase:false
+ ]
].
Time millisecondsToRun:[
- Symbol allInstancesDo:[:sym |
- '*at:*' match:sym ignoreCase:false
- ]
+ Symbol allInstancesDo:[:sym |
+ '*at:*' match:sym ignoreCase:false
+ ]
].
"
@@ -4187,7 +4234,7 @@
Lower/uppercase are considered different.
NOTICE: match-meta character interpretation is like in unix-matching (glob),
- NOT the ST-80 meaning.
+ NOT the ST-80 meaning.
NOTICE: this is GLOB, which is different from regex matching (see matchesRegex:)
NOTICE: the receiver is the match pattern"
@@ -4377,19 +4424,19 @@
n := self occurrencesOf:$'.
n ~~ 0 ifTrue:[
- s := self class new:(n + 2 + self size).
- s at:1 put:$'.
- index := 2.
- self do:[:thisChar |
- (thisChar == $') ifTrue:[
- s at:index put:thisChar.
- index := index + 1.
- ].
- s at:index put:thisChar.
- index := index + 1.
- ].
- s at:index put:$'.
- ^ s
+ s := self class new:(n + 2 + self size).
+ s at:1 put:$'.
+ index := 2.
+ self do:[:thisChar |
+ (thisChar == $') ifTrue:[
+ s at:index put:thisChar.
+ index := index + 1.
+ ].
+ s at:index put:thisChar.
+ index := index + 1.
+ ].
+ s at:index put:$'.
+ ^ s
].
^ '''' , self , ''''
@@ -4760,7 +4807,7 @@
dict at:$a put:'AAAAA'.
dict at:$b put:[ Time now ].
dict at:'foo' put:[ Date today ].
- 'hello %1 %a %b %(foo)' expandPlaceholdersWith:dict
+ 'hello %1 %a %b %(foo)' expandPlaceholdersWith:dict
"
"Modified: 1.7.1997 / 00:53:24 / cg"
@@ -4781,7 +4828,7 @@
See also bindWith:... for VisualAge compatibility.
Use %<cr> to insert a CR and %<tab> to insert a TAB."
- |next v key
+ |next v key
idx "{ SmallInteger }"
idx2 "{ SmallInteger }"
start "{ SmallInteger }"
@@ -4790,95 +4837,95 @@
stop := self size.
start := 1.
[start <= stop] whileTrue:[
- idx := self indexOf:$% startingAt:start.
- (idx == 0 or:[idx == stop]) ifTrue:[
- aStream nextPutAll:self startingAt:start to:stop.
- ^ self.
- ].
- "found a %"
- aStream nextPutAll:self startingAt:start to:(idx - 1).
- next := self at:(idx + 1).
- (next == $%) ifTrue:[
- aStream nextPut:$%.
- ] ifFalse:[
- next == $< ifTrue:[
- idx2 := self indexOf:$> startingAt:idx+2.
- key := self copyFrom:idx+2 to:idx2-1.
- idx := idx2 - 1.
- key := key asSymbolIfInterned.
- (#(cr tab nl return lf ff null) includesIdentical:key) ifTrue:[
- aStream nextPut:(Character perform:key).
- ].
- ] ifFalse:[
- next isDigit ifTrue:[
- v := argArrayOrDictionary at:(next digitValue) ifAbsent:''
- ] ifFalse:[
- next == $( ifTrue:[
- idx2 := self indexOf:$) startingAt:idx+2.
- key := self copyFrom:idx+2 to:idx2-1.
- idx := idx2 - 1.
- (argArrayOrDictionary includesKey:key) ifTrue:[
- v := argArrayOrDictionary at:key
- ] ifFalse:[
- key := key asSymbolIfInterned ? key.
- (argArrayOrDictionary includesKey:key) ifTrue:[
- v := argArrayOrDictionary at:key
- ] ifFalse:[
- (key size == 1 and:[ argArrayOrDictionary includesKey:(key at:1)]) ifTrue:[
- v := argArrayOrDictionary at:(key at:1)
- ] ifFalse:[
- key isNumeric ifTrue:[
- key := Integer readFrom:key onError:nil.
- ].
- v := argArrayOrDictionary at:key ifAbsent:''
- ]
- ].
- ].
- ] ifFalse:[
- (next isLetter and:[argArrayOrDictionary isSequenceable not "is a Dictionary"]) ifTrue:[
- "so next is a non-numeric single character."
- v := argArrayOrDictionary
- at:next
- ifAbsent:[
- "try symbol instead of character"
- argArrayOrDictionary
- at:next asSymbol
- ifAbsent:[String with:$% with:next].
- ].
- ] ifFalse:[
- v := String with:$% with:next.
- ].
- ]
- ].
- "/ v notNil ifTrue:[
- v isBlock ifTrue:[
- v := v value
- ].
-
- v printOn:aStream.
- "/ ].
- ]
- ].
- start := idx + 2
+ idx := self indexOf:$% startingAt:start.
+ (idx == 0 or:[idx == stop]) ifTrue:[
+ aStream nextPutAll:self startingAt:start to:stop.
+ ^ self.
+ ].
+ "found a %"
+ aStream nextPutAll:self startingAt:start to:(idx - 1).
+ next := self at:(idx + 1).
+ (next == $%) ifTrue:[
+ aStream nextPut:$%.
+ ] ifFalse:[
+ next == $< ifTrue:[
+ idx2 := self indexOf:$> startingAt:idx+2.
+ key := self copyFrom:idx+2 to:idx2-1.
+ idx := idx2 - 1.
+ key := key asSymbolIfInterned.
+ (#(cr tab nl return lf ff null) includesIdentical:key) ifTrue:[
+ aStream nextPut:(Character perform:key).
+ ].
+ ] ifFalse:[
+ next isDigit ifTrue:[
+ v := argArrayOrDictionary at:(next digitValue) ifAbsent:''
+ ] ifFalse:[
+ next == $( ifTrue:[
+ idx2 := self indexOf:$) startingAt:idx+2.
+ key := self copyFrom:idx+2 to:idx2-1.
+ idx := idx2 - 1.
+ (argArrayOrDictionary includesKey:key) ifTrue:[
+ v := argArrayOrDictionary at:key
+ ] ifFalse:[
+ key := key asSymbolIfInterned ? key.
+ (argArrayOrDictionary includesKey:key) ifTrue:[
+ v := argArrayOrDictionary at:key
+ ] ifFalse:[
+ (key size == 1 and:[ argArrayOrDictionary includesKey:(key at:1)]) ifTrue:[
+ v := argArrayOrDictionary at:(key at:1)
+ ] ifFalse:[
+ key isNumeric ifTrue:[
+ key := Integer readFrom:key onError:nil.
+ ].
+ v := argArrayOrDictionary at:key ifAbsent:''
+ ]
+ ].
+ ].
+ ] ifFalse:[
+ (next isLetter and:[argArrayOrDictionary isSequenceable not "is a Dictionary"]) ifTrue:[
+ "so next is a non-numeric single character."
+ v := argArrayOrDictionary
+ at:next
+ ifAbsent:[
+ "try symbol instead of character"
+ argArrayOrDictionary
+ at:next asSymbol
+ ifAbsent:[String with:$% with:next].
+ ].
+ ] ifFalse:[
+ v := String with:$% with:next.
+ ].
+ ]
+ ].
+ "/ v notNil ifTrue:[
+ v isBlock ifTrue:[
+ v := v value
+ ].
+
+ v printOn:aStream.
+ "/ ].
+ ]
+ ].
+ start := idx + 2
].
"
String streamContents:[:s|
- 'hello %1' expandPlaceholdersWith:#('world') on:s.
- s cr.
- 'hello %1; how is %2' expandPlaceholdersWith:#('world' 'this') on:s.
- s cr.
- 'hello %2; how is %1' expandPlaceholdersWith:#('world' 'this') on:s.
- s cr.
- '%1 plus %2 gives %3 ' expandPlaceholdersWith:#(4 5 9) on:s.
- s cr.
- '%%(1)0 gives %(1)0' expandPlaceholdersWith:#(123) on:s.
- s cr.
- '%%10 gives %10' expandPlaceholdersWith:#(123) on:s.
- s cr.
- '%%(10) gives %(10) %<cr>%<tab>next line' expandPlaceholdersWith:#(123) on:s.
- s cr.
- '%test gives %1' expandPlaceholdersWith:#(123) on:s.
+ 'hello %1' expandPlaceholdersWith:#('world') on:s.
+ s cr.
+ 'hello %1; how is %2' expandPlaceholdersWith:#('world' 'this') on:s.
+ s cr.
+ 'hello %2; how is %1' expandPlaceholdersWith:#('world' 'this') on:s.
+ s cr.
+ '%1 plus %2 gives %3 ' expandPlaceholdersWith:#(4 5 9) on:s.
+ s cr.
+ '%%(1)0 gives %(1)0' expandPlaceholdersWith:#(123) on:s.
+ s cr.
+ '%%10 gives %10' expandPlaceholdersWith:#(123) on:s.
+ s cr.
+ '%%(10) gives %(10) %<cr>%<tab>next line' expandPlaceholdersWith:#(123) on:s.
+ s cr.
+ '%test gives %1' expandPlaceholdersWith:#(123) on:s.
]
"
@@ -4890,7 +4937,7 @@
dict at:$a put:'AAAAA'.
dict at:$b put:[ Time now ].
String streamContents:[:s|
- 'hello %1 %a %b' expandPlaceholdersWith:dict on:s.
+ 'hello %1 %a %b' expandPlaceholdersWith:dict on:s.
].
"
@@ -5891,18 +5938,19 @@
!CharacterArray class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.462 2011/11/29 10:55:55 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.464 2011/12/26 14:52:18 cg Exp $'
!
version_CVS
- ^ 'Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.462 2011/11/29 10:55:55 cg Exp '
+ ^ 'Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.464 2011/12/26 14:52:18 cg Exp '
!
version_SVN
- ^ '$Id: CharacterArray.st 10751 2011-12-21 22:04:49Z vranyj1 $'
+ ^ '$Id: CharacterArray.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
CharacterArray initialize!
+
--- a/ConfigurableFeatures.st Fri Dec 23 13:41:34 2011 +0000
+++ b/ConfigurableFeatures.st Fri Jan 06 08:53:28 2012 +0000
@@ -98,12 +98,58 @@
!ConfigurableFeatures class methodsFor:'queries-features'!
-hasFileBasedSourceCodeManagerSupport
- |mgr|
+hasCVSSupport
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ ^ (Smalltalk at: #'CVSSourceCodeManager' ifAbsent:nil) notNil
+
+ "
+ ConfigurableFeatures hasCVSSupport
+ "
+
+ "Created: / 03-01-2012 / 15:36:54 / cg"
+!
+
+hasCVSSupportEnabled
+ |cvs|
"/ use Smalltalk-at to trick the dependency/prerequisite generator
- ^ (mgr := Smalltalk at: #'FileBasedSourceCodeManager') notNil
- and:[ mgr enabled ]
+ cvs := Smalltalk at: #'CVSSourceCodeManager' ifAbsent:nil.
+
+ ^ cvs notNil
+ and:[ cvs isLoaded
+ and:[ cvs enabled ]]
+
+ "Created: / 03-01-2012 / 15:42:16 / cg"
+!
+
+hasDataBaseSourceCodeManagerSupport
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ ^ (Smalltalk at: #'DataBaseSourceCodeManager' ifAbsent:nil) notNil
+
+ "
+ ConfigurableFeatures hasDataBaseSourceCodeManagerSupport
+ "
+
+ "Created: / 03-01-2012 / 15:36:03 / cg"
+!
+
+hasDataBaseSourceCodeManagerSupportEnabled
+ |repository|
+
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ repository := Smalltalk at: #'DataBaseSourceCodeManager' ifAbsent:nil.
+
+ ^ repository notNil
+ and:[ repository isLoaded
+ and:[ repository enabled ]]
+
+ "Created: / 03-01-2012 / 15:36:12 / cg"
+!
+
+hasFileBasedSourceCodeManagerSupport
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ ^ (Smalltalk at: #'FileBasedSourceCodeManager' ifAbsent:nil) notNil
+
"
ConfigurableFeatures hasFileBasedSourceCodeManagerSupport
"
@@ -115,8 +161,7 @@
|repository|
"/ use Smalltalk-at to trick the dependency/prerequisite generator
- repository := Smalltalk at: #'FileBasedSourceCodeManager'.
-
+ repository := Smalltalk at: #'FileBasedSourceCodeManager' ifAbsent:nil.
^ repository notNil
and:[ repository isLoaded
and:[ repository enabled ]]
@@ -124,13 +169,57 @@
"Created: / 21-12-2011 / 17:07:08 / cg"
!
-hasSubversionSupport
- |subVersionRepository|
+hasMonticelloSupport
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ ^ (Smalltalk at: #'MonticelloSourceCodeManager' ifAbsent:nil) notNil
+
+ "
+ ConfigurableFeatures hasMonticelloSupport
+ "
+
+ "Created: / 03-01-2012 / 15:44:32 / cg"
+!
+
+hasMonticelloSupportEnabled
+ |cvs|
"/ use Smalltalk-at to trick the dependency/prerequisite generator
- subVersionRepository := Smalltalk at: #'SVN::RepositoryManager'.
+ cvs := Smalltalk at: #'MonticelloSourceCodeManager' ifAbsent:nil.
+
+ ^ cvs notNil
+ and:[ cvs isLoaded
+ and:[ cvs enabled ]]
+
+ "Created: / 03-01-2012 / 15:44:39 / cg"
+!
+
+hasPerforceSupport
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ ^ (Smalltalk at: #'PerforceSourceCodeManager' ifAbsent:nil) notNil
+
+ "
+ ConfigurableFeatures hasPerforceSupport
+ "
- ^ subVersionRepository notNil
+ "Created: / 03-01-2012 / 15:43:42 / cg"
+!
+
+hasPerforceSupportEnabled
+ |cvs|
+
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ cvs := Smalltalk at: #'PerforceSourceCodeManager' ifAbsent:nil.
+
+ ^ cvs notNil
+ and:[ cvs isLoaded
+ and:[ cvs enabled ]]
+
+ "Created: / 03-01-2012 / 15:43:28 / cg"
+!
+
+hasSubversionSupport
+ "/ use Smalltalk-at to trick the dependency/prerequisite generator
+ ^ (Smalltalk at: #'SVN::RepositoryManager' ifAbsent:nil) notNil
"
ConfigurableFeatures hasSubversionSupport
@@ -143,7 +232,7 @@
|subVersionRepository|
"/ use Smalltalk-at to trick the dependency/prerequisite generator
- subVersionRepository := Smalltalk at: #'SVN::RepositoryManager'.
+ subVersionRepository := Smalltalk at: #'SVN::RepositoryManager' ifAbsent:nil.
^ subVersionRepository notNil
and:[ subVersionRepository isLoaded
@@ -155,15 +244,16 @@
!ConfigurableFeatures class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/ConfigurableFeatures.st,v 1.2 2011/12/21 18:19:57 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/ConfigurableFeatures.st,v 1.4 2012/01/03 14:44:49 cg Exp $'
!
version_CVS
- ^ 'Header: /cvs/stx/stx/libbasic/ConfigurableFeatures.st,v 1.2 2011/12/21 18:19:57 cg Exp '
+ ^ 'Header: /cvs/stx/stx/libbasic/ConfigurableFeatures.st,v 1.4 2012/01/03 14:44:49 cg Exp '
!
version_SVN
- ^ '$Id: ConfigurableFeatures.st 10751 2011-12-21 22:04:49Z vranyj1 $'
+ ^ '$Id: ConfigurableFeatures.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/Filename.st Fri Dec 23 13:41:34 2011 +0000
+++ b/Filename.st Fri Jan 06 08:53:28 2012 +0000
@@ -5249,6 +5249,37 @@
"
!
+directoryContentsMatching: patternOrCollectionOfThose
+ "Same as directoryContants, but returns only files
+ that match the given pattern(s).
+ This uses String>>matches: for glob pattern matching"
+
+ | names patterns |
+
+ patterns := patternOrCollectionOfThose isString
+ ifTrue: [Array with: patternOrCollectionOfThose]
+ ifFalse:[patternOrCollectionOfThose].
+ names := self directoryContents.
+ names isNil ifTrue:[^ nil].
+ ^ names
+ select: [:e | patterns anySatisfy:[:pattern|e matches: pattern]]
+
+ "
+ '/etc' asFilename
+ directoryContentsMatching: 'pass*'
+
+ '/etc' asFilename
+ directoryContentsMatching: #('pass*' 'nsswitch.conf')
+
+ '/etc' asFilename
+ directoryContentsMatching: #('does-not-exists.txt')
+
+ "
+
+ "Created: / 03-06-2009 / 09:52:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+ "Modified (format): / 18-11-2011 / 14:45:32 / cg"
+!
+
fullDirectoryContents
"return the full contents of the directory as a collection of strings.
This is much like #directoryContents, but includes an entry for the
@@ -5898,16 +5929,17 @@
!Filename class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Filename.st,v 1.371 2011/10/19 14:55:37 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Filename.st,v 1.372 2011/12/25 10:35:01 cg Exp $'
!
version_CVS
- ^ 'Header: /cvs/stx/stx/libbasic/Filename.st,v 1.371 2011/10/19 14:55:37 cg Exp '
+ ^ 'Header: /cvs/stx/stx/libbasic/Filename.st,v 1.372 2011/12/25 10:35:01 cg Exp '
!
version_SVN
- ^ '$Id: Filename.st 10729 2011-10-31 22:19:21Z vranyj1 $'
+ ^ '$Id: Filename.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
Filename initialize!
+
--- a/HashStream.st Fri Dec 23 13:41:34 2011 +0000
+++ b/HashStream.st Fri Jan 06 08:53:28 2012 +0000
@@ -85,6 +85,12 @@
Use hashFunction: there"
^ true
+!
+
+hashSize
+ self subclassResponsibility
+
+ "Created: / 04-01-2012 / 19:22:32 / cg"
! !
!HashStream class methodsFor:'self tests'!
@@ -323,14 +329,15 @@
!HashStream class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/HashStream.st,v 1.14 2011/05/13 08:32:58 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/HashStream.st,v 1.15 2012/01/04 18:55:36 cg Exp $'
!
version_CVS
- ^ '§Header: /cvs/stx/stx/libbasic/HashStream.st,v 1.14 2011/05/13 08:32:58 stefan Exp §'
+ ^ 'Header: /cvs/stx/stx/libbasic/HashStream.st,v 1.15 2012/01/04 18:55:36 cg Exp '
!
version_SVN
- ^ '$Id: HashStream.st 10729 2011-10-31 22:19:21Z vranyj1 $'
+ ^ '$Id: HashStream.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/ProjectDefinition.st Fri Dec 23 13:41:34 2011 +0000
+++ b/ProjectDefinition.st Fri Jan 06 08:53:28 2012 +0000
@@ -4146,7 +4146,7 @@
^ '-headerDir=.'
"Created: / 18-08-2006 / 13:01:52 / cg"
- "Modified: / 06-12-2011 / 21:23:51 / cg"
+ "Modified: / 23-12-2011 / 15:07:27 / cg"
!
objectLine_make_dot_spec_mappings: aClassName
@@ -4415,7 +4415,7 @@
# Argument(s) to the stc compiler (stc --usage).
-# --headerDir=. : create header files locally
+# -headerDir=. : create header files locally
# (if removed, they will be created as common
# -Pxxx : defines the package
# -Zxxx : a prefix for variables within the classLib
@@ -4453,7 +4453,7 @@
"Created: / 08-08-2006 / 19:31:29 / fm"
"Modified: / 09-08-2006 / 15:10:57 / fm"
- "Modified: / 06-12-2011 / 21:24:20 / cg"
+ "Modified: / 23-12-2011 / 15:07:23 / cg"
!
makefile
@@ -6742,16 +6742,17 @@
!ProjectDefinition class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/ProjectDefinition.st,v 1.375 2011/12/21 15:44:44 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/ProjectDefinition.st,v 1.376 2011/12/23 14:09:03 cg Exp $'
!
version_CVS
- ^ '§Header: /cvs/stx/stx/libbasic/ProjectDefinition.st,v 1.375 2011/12/21 15:44:44 cg Exp §'
+ ^ 'Header: /cvs/stx/stx/libbasic/ProjectDefinition.st,v 1.376 2011/12/23 14:09:03 cg Exp '
!
version_SVN
- ^ '$Id: ProjectDefinition.st 10752 2011-12-23 13:41:34Z vranyj1 $'
+ ^ '$Id: ProjectDefinition.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
ProjectDefinition initialize!
+
--- a/SHA1Stream.st Fri Dec 23 13:41:34 2011 +0000
+++ b/SHA1Stream.st Fri Jan 06 08:53:28 2012 +0000
@@ -440,7 +440,7 @@
!SHA1Stream class methodsFor:'testing'!
testVector
- "Test Vectors (from FIPS PUB 180-1)"
+ "Test Vectors (from FIPS PUB 180-1 and Wikipedia page)"
^ #(
('Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'
@@ -467,6 +467,8 @@
"
self test
"
+
+ "Modified (comment): / 26-12-2011 / 10:56:46 / cg"
! !
!SHA1Stream methodsFor:'initialization'!
@@ -682,16 +684,17 @@
!SHA1Stream class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/SHA1Stream.st,v 1.19 2010/04/13 14:36:36 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/SHA1Stream.st,v 1.20 2011/12/26 09:56:58 cg Exp $'
!
version_CVS
- ^ '§Header: /cvs/stx/stx/libbasic/SHA1Stream.st,v 1.19 2010/04/13 14:36:36 cg Exp §'
+ ^ 'Header: /cvs/stx/stx/libbasic/SHA1Stream.st,v 1.20 2011/12/26 09:56:58 cg Exp '
!
version_SVN
- ^ '$Id: SHA1Stream.st 10729 2011-10-31 22:19:21Z vranyj1 $'
+ ^ '$Id: SHA1Stream.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
SHA1Stream initialize!
+
--- a/Smalltalk.st Fri Dec 23 13:41:34 2011 +0000
+++ b/Smalltalk.st Fri Jan 06 08:53:28 2012 +0000
@@ -918,8 +918,12 @@
If there is nothing stored under this key, do nothing.
Otherwise, evaluate aBlock, passing the retrieved value as argument."
+ |val|
+
(self includesKey:aKey) ifTrue:[
- ^ aBlock value:(self at:aKey)
+ (val := self at:aKey) notNil ifTrue:[
+ ^ aBlock value:val
+ ]
].
^ nil
@@ -928,6 +932,7 @@
Smalltalk at:#Object ifPresent:[:what | Transcript showCR:what].
"
+ "Modified: / 27-12-2011 / 10:14:30 / cg"
!
at:aKey put:aValue
@@ -7715,15 +7720,16 @@
!Smalltalk class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Smalltalk.st,v 1.982 2011/12/06 12:28:53 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Smalltalk.st,v 1.983 2011/12/27 09:44:18 cg Exp $'
!
version_CVS
- ^ 'Header: /cvs/stx/stx/libbasic/Smalltalk.st,v 1.982 2011/12/06 12:28:53 cg Exp '
+ ^ 'Header: /cvs/stx/stx/libbasic/Smalltalk.st,v 1.983 2011/12/27 09:44:18 cg Exp '
!
version_SVN
- ^ '$Id: Smalltalk.st 10751 2011-12-21 22:04:49Z vranyj1 $'
+ ^ '$Id: Smalltalk.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/String.st Fri Dec 23 13:41:34 2011 +0000
+++ b/String.st Fri Jan 06 08:53:28 2012 +0000
@@ -514,7 +514,6 @@
-
!String methodsFor:'Compatibility-VW5.4'!
asGUID
@@ -1104,7 +1103,7 @@
'hello world' indexOfAny:'AOE' startingAt:1
'hello world' indexOfAny:'o' startingAt:6
'hello world' indexOfAny:'o' startingAt:6
- 'hello world§' indexOfAny:'#§$' startingAt:6
+ 'hello world' indexOfAny:'#$' startingAt:6
"
!
@@ -1623,7 +1622,7 @@
^ self primitiveFailed
!
-hash
+hash_dragonBook
"return an integer useful as a hash-key"
%{ /* NOCONTEXT */
@@ -1683,6 +1682,57 @@
%}
!
+hash_sdbm
+ "return an integer useful as a hash-key"
+
+%{ /* NOCONTEXT */
+
+ REGISTER unsigned ch, val;
+ REGISTER unsigned char *cp;
+ int l;
+
+ cp = __stringVal(self);
+ l = __stringSize(self);
+ if (__qClass(self) != @global(String)) {
+ int n = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(self))->c_ninstvars));
+
+ cp += n;
+ l -= n;
+ }
+
+ /*
+ * this is the sdbm algorithm
+ */
+ val = 0;
+ while (l >= 4) {
+ l -= 4;
+ ch = cp[0];
+ val = (val * 65599) + ch;
+ ch = cp[1];
+ val = (val * 65599) + ch;
+ ch = cp[2];
+ val = (val * 65599) + ch;
+ ch = cp[3];
+ val = (val * 65599) + ch;
+ cp += 4;
+ }
+ while (l) {
+ l--;
+ ch = *cp++;
+ val = (val * 65599) + ch;
+ }
+ RETURN ( __mkSmallInteger(val & _MAX_INT));
+%}
+
+ "
+ 'a' hash_sdbm
+ 'ab' hash_sdbm
+ 'ab' asUnicode16String hash_sdbm
+ "
+
+ "Created: / 26-12-2011 / 13:53:09 / cg"
+!
+
~= aString
"Compare the receiver with the argument and return true if the
receiver is not equal to the argument. Otherwise return false.
@@ -3255,7 +3305,6 @@
^ super reverse
! !
-
!String methodsFor:'substring searching'!
indexOfSubCollection:aSubString startingAt:startIndex ifAbsent:exceptionValue caseSensitive:caseSensitive
@@ -3719,14 +3768,15 @@
!String class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/String.st,v 1.275 2011/01/12 13:51:12 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/String.st,v 1.276 2011/12/26 13:18:56 cg Exp $'
!
version_CVS
- ^ '§Header: /cvs/stx/stx/libbasic/String.st,v 1.275 2011/01/12 13:51:12 cg Exp §'
+ ^ 'Header: /cvs/stx/stx/libbasic/String.st,v 1.276 2011/12/26 13:18:56 cg Exp '
!
version_SVN
- ^ '$Id: String.st 10729 2011-10-31 22:19:21Z vranyj1 $'
+ ^ '$Id: String.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/Symbol.st Fri Dec 23 13:41:34 2011 +0000
+++ b/Symbol.st Fri Jan 06 08:53:28 2012 +0000
@@ -99,18 +99,18 @@
OBJ newSymbol;
if (__isSymbol(aString)) {
- RETURN (aString);
+ RETURN (aString);
}
if (__isStringLike(aString)) {
- newSymbol = __MKSYMBOL(__stringVal(aString), (OBJ *)0);
- if (newSymbol != nil) {
- RETURN (newSymbol);
- }
+ newSymbol = __MKSYMBOL(__stringVal(aString), (OBJ *)0);
+ if (newSymbol != nil) {
+ RETURN (newSymbol);
+ }
}
%}.
(aString class ~~ String and:[aString class ~~ ImmutableString]) ifTrue:[
- "only allowed to intern strings"
- ^ self mustBeString
+ "only allowed to intern strings"
+ ^ self mustBeString
].
^ ObjectMemory allocationFailureSignal raise.
!
@@ -185,7 +185,6 @@
-
!Symbol methodsFor:'Compatibility-Squeak'!
isUnary
@@ -194,18 +193,18 @@
precedence
"the precedence in an expression; 0 is highest;
- unary < binary < keyword"
+ unary < binary < keyword"
self size = 0
- ifTrue: [^ 0].
+ ifTrue: [^ 0].
self first isLetter
- ifFalse: [^ 2].
+ ifFalse: [^ 2].
self last = $:
- ifTrue: [^ 3].
+ ifTrue: [^ 3].
^ 1
"
- self assert:(#foo precedence < #+ precedence).
+ self assert:(#foo precedence < #+ precedence).
self assert:(#+ precedence < #key: precedence).
self assert:(#foo precedence < #key: precedence).
"
@@ -262,9 +261,9 @@
!
nameSpace
- ^ self isNameSpaceSelector
- ifTrue: [ self nameSpaceAndSelector first ]
- ifFalse:[ nil ]
+ ^ self isNameSpaceSelector
+ ifTrue: [ self nameSpaceAndSelector first ]
+ ifFalse:[ nil ]
"Created: / 20-07-2010 / 10:41:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
@@ -273,7 +272,7 @@
|nsPart selPart idx ns|
self isNameSpaceSelector ifFalse:[
- ^ Array with:nil with:self
+ ^ Array with:nil with:self
].
idx := self indexOf:$: startingAt:3.
nsPart := self copyFrom:2 to:idx - 1.
@@ -285,9 +284,9 @@
!
selector
- ^ self isNameSpaceSelector
- ifTrue: [ self nameSpaceAndSelector second ]
- ifFalse:[ self ]
+ ^ self isNameSpaceSelector
+ ifTrue: [ self nameSpaceAndSelector second ]
+ ifFalse:[ self ]
"Created: / 20-07-2010 / 10:41:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
@@ -321,85 +320,131 @@
identityHash
"interned symbols can return a better hash key"
-%{ /* NOCONTEXT */
+ "/ immediately after any change, execute (maybe in a debugger):
+ "/ Set allSubInstancesDo:[:s | s rehash]
- REGISTER unsigned INT g, val;
+%{ /* NOCONTEXT */
+/* for now, this is needed... */
+#define xxHASH_SDBM
+#define HASH_DRAGONBOOK
+
+ REGISTER unsigned INT val;
REGISTER unsigned char *cp, *ce;
int l;
if (__Class(self) == Symbol) {
- val = __GET_HASH(self);
- /*
- * only do it, if I have no standard hash key
- * assigned (which can only happen due to a #become:,
- * or by creating a symbol uninterned, and interning it
- * after it got a hashKey assigned.
- */
- if (val == 0) {
- cp = __stringVal(self);
- l = __stringSize(self);
+ val = __GET_HASH(self);
+ /*
+ * only do it, if I have no standard hash key
+ * assigned (which can only happen due to a #become:,
+ * or by creating a symbol uninterned, and interning it
+ * after it got a hashKey assigned.
+ */
+ if (val == 0) {
+ cp = __stringVal(self);
+ l = __stringSize(self);
+#ifdef HASH_DRAGONBOOK
+ /*
+ * this is the dragon-book algorithm
+ * We have tested 5-bit shifts as well:
+ *
+ * ST/X Symbols: 17807
+ * Hashkey collisions (4bit): 14 0.07%
+ * Hashkey collisions (5bit): 300 1.68%
+ */
- /*
- * this is the dragon-book algorithm
- * We have tested 5-bit shifts as well:
- *
- * ST/X Symbols: 17807
- * Hashkey collisions (4bit): 14 0.07%
- * Hashkey collisions (5bit): 300 1.68%
- */
+ if (l > 0) {
+ val = cp[0];
+ if (l > 1) {
+ val = (val << 4) + cp[1];
+ if (l > 2) {
+ val = (val << 4) + cp[2];
+ if (l > 3) {
+ val = (val << 4) + cp[3];
+ if (l > 4) {
+ val = (val << 4) + cp[4];
+ if (l > 5) {
+ val = (val << 4) + cp[5];
+ if (l > 6) {
+ val = (val << 4) + cp[6];
+ for (ce = cp + l, cp += 7; cp < ce; cp++) {
+ REGISTER unsigned INT g;
- if (l > 0) {
- val = cp[0];
- if (l > 1) {
- val = (val << 4) + cp[1];
- if (l > 2) {
- val = (val << 4) + cp[2];
- if (l > 3) {
- val = (val << 4) + cp[3];
- if (l > 4) {
- val = (val << 4) + cp[4];
- if (l > 5) {
- val = (val << 4) + cp[5];
- if (l > 6) {
- val = (val << 4) + cp[6];
- for (ce = cp + l, cp += 7; cp < ce; cp++) {
- if (g = (val & 0xF0000000)) {
- val ^= g >> 24;
- val ^= g;
- }
- val = (val << 4) + *cp;
- }
- }
- }
- }
- }
- }
- }
- } else {
- val = 0;
- }
- val = (val * 31415821) & _MAX_INT;
- } else {
- val = __MAKE_HASH__(val);
- }
- RETURN ( __mkSmallInteger(val) );
+ if (g = (val & 0xF0000000)) {
+ val ^= g >> 24;
+ val ^= g;
+ }
+ val = (val << 4) + *cp;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ val = 0;
+ }
+ val = (val * 31415821) & _MAX_INT;
+#else
+# ifdef HASH_SDBM
+ /*
+ * this is the sdbm algorithm
+ *
+ * ST/X Symbols: 51404
+ * Hashkey collisions (dragonBook): 54
+ * Hashkey collisions (sdbm): 2
+ */
+ val = 0;
+ while (l >= 4) {
+ unsigned INT ch;
+
+ l -= 4;
+ ch = cp[0];
+ val = (val * 65599) + ch;
+ ch = cp[1];
+ val = (val * 65599) + ch;
+ ch = cp[2];
+ val = (val * 65599) + ch;
+ ch = cp[3];
+ val = (val * 65599) + ch;
+ cp += 4;
+ }
+ while (l) {
+ unsigned INT ch;
+
+ l--;
+ ch = *cp++;
+ val = (val * 65599) + ch;
+ }
+ val = val & _MAX_INT;
+# else
+ error error
+# endif
+#endif
+ } else {
+ val = __MAKE_HASH__(val);
+ }
+ RETURN ( __mkSmallInteger(val) );
}
%}.
^ super identityHash
"
- |hashColl hashSet|
+ |hashColl hashSet|
- hashColl := OrderedCollection new:20000.
- Symbol allInstancesDo:[:instance |
- hashColl add:instance identityHash
- ].
- hashSet := hashColl asSet.
+ hashColl := OrderedCollection new:20000.
+ Symbol allInstancesDo:[:instance |
+ hashColl add:instance identityHash
+ ].
+ hashSet := hashColl asSet.
- Transcript showCR:'Symbols: ', hashColl size printString,
- ' unique hash keys: ', hashSet size printString,
- ' collisions:', (hashColl size - hashSet size) printString.
+ Transcript showCR:'Symbols: ', hashColl size printString,
+ ' unique hash keys: ', hashSet size printString,
+ ' collisions:', (hashColl size - hashSet size) printString.
"
+
+ "Modified (comment): / 26-12-2011 / 14:32:10 / cg"
!
~= something
@@ -663,16 +708,16 @@
coll := OrderedCollection new.
s := ReadStream on:self.
[s atEnd] whileFalse:[
- part := s through:$:.
- coll add:part
+ part := s through:$:.
+ coll add:part
].
^ coll asArray
"
#at:put: keywords
- #at: keywords
- #+ keywords
- #size keywords
+ #at: keywords
+ #+ keywords
+ #size keywords
"
"Modified (Comment): / 30-06-2011 / 17:46:21 / cg"
@@ -758,9 +803,10 @@
!Symbol class methodsFor:'documentation'!
version_CVS
- ^ '§Header: /cvs/stx/stx/libbasic/Symbol.st,v 1.96 2011/09/13 09:46:44 cg Exp §'
+ ^ 'Header: /cvs/stx/stx/libbasic/Symbol.st,v 1.99 2011/12/29 00:29:45 cg Exp '
!
version_SVN
- ^ '$Id: Symbol.st 10700 2011-09-29 15:44:37Z vranyj1 $'
+ ^ '$Id: Symbol.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/UserPreferences.st Fri Dec 23 13:41:34 2011 +0000
+++ b/UserPreferences.st Fri Jan 06 08:53:28 2012 +0000
@@ -744,6 +744,30 @@
soapLoggingLevel:anIntegerBetween0_and_3
^ self at:#soapLoggingLevel put:anIntegerBetween0_and_3
+!
+
+socksProxyHost
+ ^ self at:#socksProxyHost ifAbsent:nil
+
+ "Created: / 27-12-2011 / 14:40:27 / cg"
+!
+
+socksProxyHost:aString
+ ^ self at:#socksProxyHost put:aString
+
+ "Created: / 27-12-2011 / 14:42:15 / cg"
+!
+
+socksProxyPort
+ ^ self at:#socksProxyPort ifAbsent:nil
+
+ "Created: / 27-12-2011 / 14:40:32 / cg"
+!
+
+socksProxyPort:aNumber
+ ^ self at:#socksProxyPort put:aNumber
+
+ "Created: / 27-12-2011 / 14:42:29 / cg"
! !
@@ -3711,10 +3735,15 @@
!UserPreferences class methodsFor:'documentation'!
+version
+ ^ '$Header: /cvs/stx/stx/libbasic/UserPreferences.st,v 1.292 2011/12/27 13:42:42 cg Exp $'
+!
+
version_CVS
- ^ '§Â§Header: /cvs/stx/stx/libbasic/UserPreferences.st,v 1.290 2011/09/23 17:50:05 cg Exp §§'
+ ^ 'Header: /cvs/stx/stx/libbasic/UserPreferences.st,v 1.292 2011/12/27 13:42:42 cg Exp '
!
version_SVN
- ^ '$Id: UserPreferences.st 10700 2011-09-29 15:44:37Z vranyj1 $'
+ ^ '$Id: UserPreferences.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !
+
--- a/not_delivered/SystemDictionary.st Fri Dec 23 13:41:34 2011 +0000
+++ b/not_delivered/SystemDictionary.st Fri Jan 06 08:53:28 2012 +0000
@@ -34,7 +34,7 @@
!
version
- ^ '$Id: /cvs/stx/stx/libbasic/not_delivered/SysDict.st,v 1.1 1996/09/12 01:05:30 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/not_delivered/SysDict.st,v 1.1 1996/09/12 01:05:30 cg Exp $'
!
documentation
@@ -315,3 +315,4 @@
string do:[:char | stream nextPut:char asciiValue]
! !
+
--- a/not_delivered/VMBehavior.st Fri Dec 23 13:41:34 2011 +0000
+++ b/not_delivered/VMBehavior.st Fri Jan 06 08:53:28 2012 +0000
@@ -605,7 +605,8 @@
!VMBehavior class methodsFor:'documentation'!
version
- ^ '$Id: /cvs/stx/stx/libbasic/not_delivered/VMBehavior.st,v 1.1 1996/09/12 01:03:24 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/not_delivered/VMBehavior.st,v 1.1 1996/09/12 01:03:24 cg Exp $'
! !
VMBehavior initialize!
+
--- a/stx_libbasic.st Fri Dec 23 13:41:34 2011 +0000
+++ b/stx_libbasic.st Fri Jan 06 08:53:28 2012 +0000
@@ -554,7 +554,7 @@
"Return a SVN revision number of myself.
This number is updated after a commit"
- ^ "$SVN-Revision:" '10749MP'"$"
+ ^ "$SVN-Revision:" '10752M'"$"
! !
!stx_libbasic class methodsFor:'private-prerequisites'!
@@ -580,7 +580,7 @@
!
version_SVN
- ^ '$Id: stx_libbasic.st 10751 2011-12-21 22:04:49Z vranyj1 $'
+ ^ '$Id: stx_libbasic.st 10754 2012-01-06 08:53:28Z vranyj1 $'
! !