CharacterEncoder.st
changeset 8135 f22398526ae2
parent 8134 0296806cb4bb
child 8136 30b63b09b99a
--- 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!