BaseNCoder.st
author Stefan Vogel <sv@exept.de>
Mon, 08 Jun 2009 18:35:34 +0200
changeset 2160 554dbbd8cfce
parent 2090 4b87ce97bb6a
child 2638 cde8f8841e60
permissions -rw-r--r--
new: #visitStream:with:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1965
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2002 by eXept Software AG
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
 hereby transferred.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
ObjectCoder subclass:#BaseNCoder
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:'buffer bits charCount peekByte atEnd lineLimit'
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
	category:'System-Storage'
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
!BaseNCoder class methodsFor:'documentation'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
copyright
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
 COPYRIGHT (c) 2002 by eXept Software AG
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    26
              All Rights Reserved
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
 This software is furnished under a license and may be used
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
 only in accordance with the terms of that license and with the
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
 be provided or otherwise made available to, or used by, any
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
 other person.  No title to or ownership of the software is
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
 hereby transferred.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    35
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    36
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    37
documentation
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
    Abstract superclass of Base64Coder and Base32Coder
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
    [author:]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    42
        Stefan Vogel (stefan@zwerg)
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    43
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    44
    [instance variables:]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    45
        buffer          SmallInteger   buffered data
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    46
        bits            SmallInteger   Number of valid bits in buffer
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
        charCount       SmallInteger   Number of characters since last cr
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    48
        atEnd           Boolean        true if end of Base64 string reached
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    49
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
    [class variables:]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    51
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
    [see also:]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
!BaseNCoder class methodsFor:'instance creation'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
new
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
   ^ self basicNew initialize
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    62
2090
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    63
!BaseNCoder class methodsFor:'decoding'!
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    64
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    65
decodeAsString:encodedString
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    66
    "decode a base-n encoded string.
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    67
     We already expect a string instead of a ByteArray"
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    68
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    69
    ^ (self on:encodedString readStream) stringUpToEnd
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    70
! !
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
    71
1965
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
!BaseNCoder methodsFor:'accessing'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
lineLimit:something
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
    "set the line length of the encoded output.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
     Default is a line length of 76 characters.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
     If nil, no line breaks will be done."
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
    lineLimit := something.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
!BaseNCoder methodsFor:'decoding'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
next
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
    "answer the next decoded byte"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
    |b|
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
    peekByte notNil ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
        b := peekByte.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
        peekByte := nil.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
        ^ b
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
    ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
    ^ self basicNext.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    96
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
peek
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
    "answer the next decoded byte. Do not consume this byte"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   101
    peekByte isNil ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   102
        peekByte := self basicNext.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   103
    ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
    ^ peekByte
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   107
!BaseNCoder methodsFor:'encoding'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
visitByteArray:aByteArray with:aParameter 
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   110
    ^ self
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   111
        nextPutAll:aByteArray;
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   112
        flush.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   113
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   114
    "
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   115
      self encodingOf:#[1 2 3 4 5 6 255]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   116
    "
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   119
visitObject:anObject with:aParameter
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   120
    "not defined. Use nextPut or nextPutAll:.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   121
     Could encode the printString here"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
    ^ self shouldNotImplement
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   125
2160
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   126
visitStream:aStream with:aParameter
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   127
    |byte|
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   128
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   129
    [byte := aStream nextOrNil. byte notNil] whileTrue:[
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   130
        self nextPut:byte
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   131
    ].
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   132
    self flush.
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   133
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   134
    "
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   135
      Base64Coder encodingOf:#[1 2 3 4 5 6 255]
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   136
      Base64Coder encodingOf:#[1 2 3 4 5 6 255] readStream
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   137
    "
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   138
!
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   139
1965
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   140
visitString:aString with:aParameter 
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   141
    ^ self
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   142
        nextPutAll:aString asByteArray;
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   143
        flush.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   144
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   145
    "
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   146
      |encoded decoded decoder|
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   147
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   148
      encoded := self encode:'hello world'.  
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   149
      decoded := #[] writeStream.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   150
      decoder := Base64Coder on:encoded readStream.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   151
      [decoder atEnd] whileFalse:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   152
          decoded nextPut:(decoder next).
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   153
      ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   154
      decoded := decoded contents.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   155
      decoded asString.    
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   156
    "
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   157
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   158
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   159
!BaseNCoder methodsFor:'initialization'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   160
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   161
emptyWriteStream
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   162
    "answer an empty stream. We encode as string"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   163
    
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   164
    ^ WriteStream on:(String new:64)
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   165
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   166
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   167
initialize
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   168
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   169
    buffer := bits := charCount := 0.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   170
    lineLimit := 76.   "RFC 2045 says: max 76 characters in one line"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   171
    atEnd := false.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   172
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   173
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   174
!BaseNCoder methodsFor:'misc'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   175
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   176
reset
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   177
    "reset to initial state"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   178
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   179
    super reset.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   180
    buffer := bits := charCount := 0.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   181
    atEnd := false.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
    peekByte := nil.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   185
!BaseNCoder methodsFor:'private'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   186
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
basicNext
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   188
    "answer the next decoded byte. 
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   189
     No peekByte handling is done here."
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   190
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   191
    |b|
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   192
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   193
    bits == 0 ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   194
        self fillBuffer.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   195
        bits == 0 ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   196
            ^ stream pastEndRead.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   197
        ]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   198
    ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   199
    b := (buffer bitShift:(8 - bits)) bitAnd:16rFF.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   200
    bits := bits - 8.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   201
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   202
    ^ b.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   203
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   204
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   205
!BaseNCoder methodsFor:'queries'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   206
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   207
atEnd
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   208
    "answer true, if no more bytes can be read"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   209
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   210
    bits == 0 ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   211
        atEnd ifTrue:[^ true].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   212
        self fillBuffer.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   213
        bits == 0 ifTrue:[^ true].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   214
    ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   215
    ^ false.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   216
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   217
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   218
binary
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   219
    "switch to binary mode - nothing is done here.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   220
     Defined for compatibility with ExternalStream."
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   221
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   222
    ^ self
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   223
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   224
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   225
isStream
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   226
    "we simulate a stream"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   227
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   228
    ^ true
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   229
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   230
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   231
!BaseNCoder methodsFor:'stream compatibility'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   232
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   233
nextBytesInto:anObject startingAt:offset
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   234
    "copy bytes into anObject starting at offset"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   235
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   236
    |off|
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   237
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   238
    off := offset.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   239
    [self atEnd] whileFalse:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   240
        anObject at:off put:self next.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   241
        off := off + 1.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   242
    ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   243
    ^ off - offset
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   244
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   245
2090
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   246
stringUpToEnd
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   247
    "return a collection of the elements up-to the end"
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   248
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   249
    |answerStream|
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   250
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   251
    answerStream := WriteStream on:(String new:128).
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   252
    peekByte notNil ifTrue:[
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   253
        answerStream nextPut:(Character codePoint:peekByte).
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   254
        peekByte := nil.
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   255
    ].
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   256
    [
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   257
        [bits >= 8] whileTrue:[
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   258
            answerStream nextPut:(Character codePoint:((buffer bitShift:(8 - bits)) bitAnd:16rFF)).
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   259
            bits := bits - 8.
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   260
        ].
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   261
        atEnd ifTrue:[
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   262
            bits ~~ 0 ifTrue:[
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   263
                answerStream nextPut:(Character codePoint:(buffer bitAnd:16rFF)).
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   264
                bits := 0.
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   265
            ]
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   266
        ] ifFalse:[
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   267
            self fillBuffer.
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   268
        ].
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   269
    ] doWhile:[bits > 0].
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   270
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   271
    ^ answerStream contents
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   272
!
4b87ce97bb6a New: #decodeAsString:
Stefan Vogel <sv@exept.de>
parents: 1965
diff changeset
   273
1965
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   274
upToEnd
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   275
    "return a collection of the elements up-to the end"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   276
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   277
    |answerStream|
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   278
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   279
    answerStream := WriteStream on:(ByteArray new:128).
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   280
    peekByte notNil ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   281
        answerStream nextPut:peekByte.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   282
        peekByte := nil.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   283
    ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   284
    [
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   285
        [bits >= 8] whileTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   286
            answerStream nextPut:((buffer bitShift:(8 - bits)) bitAnd:16rFF).
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   287
            bits := bits - 8.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   288
        ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   289
        atEnd ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   290
            bits ~~ 0 ifTrue:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   291
                answerStream nextPut:(buffer bitAnd:16rFF).
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   292
                bits := 0.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   293
            ]
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   294
        ] ifFalse:[
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   295
            self fillBuffer.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   296
        ].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   297
    ] doWhile:[bits > 0].
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   298
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   299
    ^ answerStream contents
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   300
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   301
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   302
!BaseNCoder methodsFor:'subclass responsibility'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   303
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   304
fillBuffer
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   305
    "fill buffer with next n characters each representing m bits"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   306
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   307
    ^ self subclassResponsibility.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   308
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   309
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   310
flush
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   311
    "flush the remaining bits of buffer. 
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   312
     The number of bits in buffer is not a multiple of m, so we pad
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   313
     the buffer and signal that padding has been done via $= characters."
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   314
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   315
    ^ self subclassResponsibility.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   316
!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   317
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   318
nextPut:aByte
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   319
    "encode aByte on the output stream"
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   320
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   321
    ^ self subclassResponsibility.
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   322
! !
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   323
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   324
!BaseNCoder class methodsFor:'documentation'!
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   325
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   326
version
2160
554dbbd8cfce new: #visitStream:with:
Stefan Vogel <sv@exept.de>
parents: 2090
diff changeset
   327
    ^ '$Header: /cvs/stx/stx/libbasic2/BaseNCoder.st,v 1.3 2009-06-08 16:35:34 stefan Exp $'
1965
a0fd03c22adb initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   328
! !