--- a/CharacterEncoder.st Tue Mar 09 01:21:54 2004 +0100
+++ b/CharacterEncoder.st Tue Mar 09 02:00:26 2004 +0100
@@ -200,7 +200,7 @@
encoderFor:encodingNameSymbol ifAbsent:exceptionValue
"given the name of an encoding, return an encoder-instance which can map these from/into unicode."
- |enc cls lcName name unicodeEncoders unicodeEncoderClasses|
+ |enc clsName cls lcName name unicodeEncoders unicodeEncoderClasses|
encodingNameSymbol isNil ifTrue:[ ^ NullEncoderInstance].
@@ -220,9 +220,12 @@
unicodeEncoderClasses := EncoderClassesByName at:#unicode.
unicodeEncoderClasses notNil ifTrue:[
- unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClass |
+ unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClassName |
(name matches:eachEncodingAlias) ifTrue:[
- ^ eachEncoderClass new.
+ cls := CharacterEncoderImplementations at:eachEncoderClassName.
+ cls notNil ifTrue:[
+ ^ cls new.
+ ]
].
].
].
@@ -241,10 +244,13 @@
unicodeEncoderClasses isNil ifTrue:[
EncoderClassesByName at:#unicode put:(unicodeEncoderClasses := Dictionary new).
].
- cls := unicodeEncoderClasses at:name ifAbsent:nil.
- cls notNil ifTrue:[
- enc := cls new.
- unicodeEncoders at:name put:enc.
+ clsName := unicodeEncoderClasses at:name ifAbsent:nil.
+ clsName notNil ifTrue:[
+ cls := CharacterEncoderImplementations at:clsName.
+ cls notNil ifTrue:[
+ enc := cls new.
+ unicodeEncoders at:name put:enc.
+ ]
].
].
].
@@ -256,20 +262,24 @@
"/ search for unicode->any and: any->name
unicodeEncoderClasses := EncoderClassesByName at:#unicode ifAbsent:nil.
unicodeEncoderClasses keysAndValuesDo:[:eachEncodingAlias :eachEncoderClass |
- |dict2|
+ |dict2 enc1 enc2|
dict2 := EncoderClassesByName at:eachEncodingAlias ifAbsent:nil.
dict2 notNil ifTrue:[
- cls := dict2 at:name ifAbsent:nil.
- cls notNil ifTrue:[
- enc := TwoStepEncoder new
- encoder1:(self encoderFor:eachEncodingAlias)
- encoder2:(cls new).
-
- AccessLock critical:[
- unicodeEncoders at:name put:enc.
- ].
- ^ enc.
+ clsName := dict2 at:name ifAbsent:nil.
+ clsName notNil ifTrue:[
+ cls := CharacterEncoderImplementations at:clsName.
+ cls notNil ifTrue:[
+ enc2 := cls new.
+ enc1 := self encoderFor:eachEncodingAlias.
+ (enc1 notNil and:[enc2 notNil]) ifTrue:[
+ enc := TwoStepEncoder new encoder1:enc1 encoder2:enc2.
+ AccessLock critical:[
+ unicodeEncoders at:name put:enc.
+ ].
+ ^ enc.
+ ]
+ ]
]
].
].
@@ -290,7 +300,7 @@
!
encoderToEncodeFrom:oldEncodingArg into:newEncodingArg
- |oldEncoding newEncoding encoders encoderClasses encoder decoder cls|
+ |oldEncoding newEncoding encoders encoderClasses encoder decoder clsName cls|
oldEncoding := oldEncodingArg ? #'unicode'.
oldEncoding == #'iso10646-1' ifTrue:[ oldEncoding := #'unicode'].
@@ -319,9 +329,12 @@
encoderClasses isNil ifTrue:[
EncoderClassesByName at:oldEncoding put:(encoderClasses := Dictionary new).
].
- cls := encoderClasses at:newEncoding ifAbsent:nil.
- cls notNil ifTrue:[
- encoder := cls new.
+ clsName := encoderClasses at:newEncoding ifAbsent:nil.
+ clsName notNil ifTrue:[
+ cls := CharacterEncoderImplementations at:clsName.
+ cls notNil ifTrue:[
+ encoder := cls new.
+ ]
].
].
].
@@ -379,7 +392,6 @@
!CharacterEncoder class methodsFor:'class initialization'!
initialize
- 'iii0' printCR.
AccessLock := Semaphore forMutualExclusion.
NullEncoderInstance := NullEncoder new.
@@ -387,8 +399,7 @@
EncoderClassesByName := Dictionary new.
CachedEncoders := Dictionary new.
- 'iii1' printCR.
- "/ class decoded-name array-of-encodingNames
+ "/ className decoded-name array-of-encodingNames
#(
(ASCII unicode ( ascii 'us-ascii' 'iso-ir-6' 'ibm-367' 'ms-cp367' 'cp367' 'iso646-us' 'ibm-cp367' ))
@@ -510,27 +521,19 @@
(SJIS unicode ( 'sjis' 'shiftjis' 'x-sjis' #'x-shift-jis' #'shift-jis'))
) triplesDo:[:className :decodesTo :encodesTo |
- |implClass dict|
-
-'iiiL1' printCR.
-CharacterEncoderImplementations printCR.
+ |dict|
- implClass := CharacterEncoderImplementations at:className.
-'iiiL2' printCR.
- implClass isNil ifTrue:[
- self halt:'missing encoder-class'
- ] ifFalse:[
-'iiiL3' printCR.
- dict := EncoderClassesByName at:decodesTo ifAbsent:nil.
- dict isNil ifTrue:[
- EncoderClassesByName at:decodesTo put:(dict := Dictionary new).
+ "/ notice that the encoders are not yet installed as autoloaded.
+ "/ Therefore, we remember their names here.
+ dict := EncoderClassesByName at:decodesTo ifAbsent:nil.
+ dict isNil ifTrue:[
+ EncoderClassesByName at:decodesTo put:(dict := Dictionary new).
+ ].
+ encodesTo do:[:eachEncodingAlias |
+ (dict includesKey:eachEncodingAlias) ifTrue:[
+ self halt:'conflicting alias'
].
- encodesTo do:[:eachEncodingAlias |
- (dict includesKey:eachEncodingAlias) ifTrue:[
- self halt:'conflicting alias'
- ].
- dict at:eachEncodingAlias put:implClass.
- ]
+ dict at:eachEncodingAlias put:className.
].
].
'iii' printCR.
@@ -1202,7 +1205,7 @@
!CharacterEncoder class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.63 2004-03-09 00:21:54 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/CharacterEncoder.st,v 1.64 2004-03-09 01:00:25 cg Exp $'
! !
CharacterEncoder initialize!