diff -r 0296806cb4bb -r f22398526ae2 CharacterEncoder.st --- 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!