Merged with /trunk jv
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 06 Jan 2012 08:53:28 +0000
branchjv
changeset 17909 0ab1deab8e9c
parent 17908 3068afa182df
child 17910 8d796ca8bd1d
Merged with /trunk
AbstractOperatingSystem.st
ApplicationDefinition.st
CharacterArray.st
ConfigurableFeatures.st
Filename.st
HashStream.st
ProjectDefinition.st
SHA1Stream.st
Smalltalk.st
String.st
Symbol.st
UserPreferences.st
not_delivered/SystemDictionary.st
not_delivered/VMBehavior.st
stx_libbasic.st
--- 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 $'
 ! !