[bug] putting character in a stream

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[bug] putting character in a stream

Stephen-71
Issue status update for
http://smalltalk.gnu.org/node/282
Post a follow up:
http://smalltalk.gnu.org/project/comments/add/282

 Project:      GNU Smalltalk
 Version:      <none>
 Component:    Base classes
 Category:     bug reports
 Priority:     normal
 Assigned to:  Unassigned
 Reported by:  swoolerton
 Updated by:   swoolerton
 Status:       active

Platform is Centos 5.2 64 bit version. GST 3.1.

This works...
               valueStream := ReadStream on: '7F'.
               stream := ReadWriteStream on: (String new).
               [valueStream atEnd] whileFalse: [
                       byte := (valueStream next digitValue * 16).
                       byte := byte + valueStream next digitValue.
                       byte printNl.
                       byte asCharacter ].

This works...
               valueStream := ReadStream on: '80'.   "change the
number"
               stream := ReadWriteStream on: (String new).
               [valueStream atEnd] whileFalse: [
                       byte := (valueStream next digitValue * 16).
                       byte := byte + valueStream next digitValue.
                       byte printNl.
                       byte asCharacter ].

This works...
               valueStream := ReadStream on: '7F'.
               stream := ReadWriteStream on: (String new).
               [valueStream atEnd] whileFalse: [
                       byte := (valueStream next digitValue * 16).
                       byte := byte + valueStream next digitValue.
                       byte printNl.
                       stream nextPut: (byte asCharacter). ].   "save
to a stream"

This crashes...
               valueStream := ReadStream on: '80'.    "change the
number"
               stream := ReadWriteStream on: (String new).
               [valueStream atEnd] whileFalse: [
                       byte := (valueStream next digitValue * 16).
                       byte := byte + valueStream next digitValue.
                       byte printNl.
                       stream nextPut: (byte asCharacter). ].

The crash looks like this...

$ gst -i ./berintdebug.st...

128
Object: '' error: Invalid argument : argument must be between $<0> and
$ΓΏ
SystemExceptions.ArgumentOutOfRange(Exception)>>signal
(AnsiExcept.st:216)
SystemExceptions.ArgumentOutOfRange(Exception)>>signal:
(AnsiExcept.st:226)
SystemExceptions.ArgumentOutOfRange class>>signalOn:mustBeBetween:and:
(AnsiExcept.st:780)
String(Object)>>checkIndexableBounds:put: (Object.st:805)
String>>at:put: (String.st:293)
ReadWriteStream(WriteStream)>>nextPut: (WriteStream.st:93)
UndefinedObject>>executeStatements (berintdebug.st:12)

By the way, I expect there is a better way of converting from hex to
decimal and putting into a stream...

Also the code below crashes the terminal window.
 Transcript show: myObject class.




_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk
Reply | Threaded
Open this post in threaded view
|

Re: [bug] putting character in a stream

Paolo Bonzini-3
Issue status update for
http://smalltalk.gnu.org/project/issue/282
Post a follow up:
http://smalltalk.gnu.org/project/comments/add/282

 Project:      GNU Smalltalk
 Version:      <none>
 Component:    Base classes
 Category:     bug reports
 Priority:     normal
 Assigned to:  Unassigned
 Reported by:  swoolerton
 Updated by:   bonzinip
-Status:       active
+Status:       invalid

The problem is that asCharacter (by design) returns a UnicodeCharacter
when given a character that is >128.  You need to use (Character value:
byte) to explicitly request a Character:

st> (Character value: 128) class
Character
st> (Character codePoint: 128) class
UnicodeCharacter
st> 128 asCharacter class
UnicodeCharacter

For ease of use, Characters and UnicodeCharacters are the same for the
range 0-127.  This works because sane representations of Unicode are
backwards compatible with 7-bit ASCII, but does not work for the range
128-255.  A Character in the range 128-255 is the /octet 128-255 stored
in a representation of a Unicode string/ (i.e. in a String), while a
UnicodeCharacter in the range 128-255 is the /character 128-255 of the
Unicode character set/.

I'll open another issue for the Transcript deadlock.




_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk
Reply | Threaded
Open this post in threaded view
|

Re: Re: [bug] putting character in a stream

Stephen-71

>
> The problem is that asCharacter (by design) returns a UnicodeCharacter
> when given a character that is >128.  You need to use (Character value:
> byte) to explicitly request a Character:
>
> st> (Character value: 128) class
> Character
> st> (Character codePoint: 128) class
> UnicodeCharacter
> st> 128 asCharacter class
> UnicodeCharacter
>
> For ease of use, Characters and UnicodeCharacters are the same for the
> range 0-127.  This works because sane representations of Unicode are
> backwards compatible with 7-bit ASCII, but does not work for the range
> 128-255.  A Character in the range 128-255 is the /octet 128-255 stored
> in a representation of a Unicode string/ (i.e. in a String), while a
> UnicodeCharacter in the range 128-255 is the /character 128-255 of the
> Unicode character set/.
>
Thank you for the clear explanation, and my code works now. I was
porting some code from Squeak so obviously Character handling is
slightly different there.

Stephen


_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk