CharacterWriteStream.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 20:55:17 +0200
changeset 24417 03b083548da2
parent 24029 b34b5808b448
child 24630 861b42a1a269
permissions -rw-r--r--
#REFACTORING by exept class: Smalltalk class changed: #recursiveInstallAutoloadedClassesFrom:rememberIn:maxLevels:noAutoload:packageTop:showSplashInLevels: Transcript showCR:(... bindWith:...) -> Transcript showCR:... with:...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10846
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     1
"
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     2
 COPYRIGHT (c) 2005 by eXept Software AG
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     3
              All Rights Reserved
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     4
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     5
 This software is furnished under a license and may be used
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     6
 only in accordance with the terms of that license and with the
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     8
 be provided or otherwise made available to, or used by, any
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
     9
 other person.  No title to or ownership of the software is
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    10
 hereby transferred.
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    11
"
8299
7930ef8d5298 Add CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 8298
diff changeset
    12
"{ Package: 'stx:libbasic' }"
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
17622
553ee52df434 class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 15358
diff changeset
    14
"{ NameSpace: Smalltalk }"
553ee52df434 class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 15358
diff changeset
    15
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
WriteStream subclass:#CharacterWriteStream
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:'currentCharacterSize'
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
	category:'Streams'
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
!
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    23
!CharacterWriteStream class methodsFor:'documentation'!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    24
10846
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    25
copyright
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    26
"
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    27
 COPYRIGHT (c) 2005 by eXept Software AG
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    28
              All Rights Reserved
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    29
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    30
 This software is furnished under a license and may be used
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    31
 only in accordance with the terms of that license and with the
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    33
 be provided or otherwise made available to, or used by, any
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    34
 other person.  No title to or ownership of the software is
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    35
 hereby transferred.
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    36
"
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    37
!
e82d25d9d165 copyright
Claus Gittinger <cg@exept.de>
parents: 10282
diff changeset
    38
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    39
documentation
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    40
"
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    41
    This is a WriteStream, which automagically changes the underlying collection,
18795
577a32890d2f #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 18613
diff changeset
    42
    if a character does not fit into the current collection 
18796
6a6867d3572e #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 18795
diff changeset
    43
    (i.e. String -> Unicode16String -> Unicode32Sting )
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    44
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    45
    [author:]
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    46
        Stefan Vogel (stefan@zwerg)
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    47
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    48
    [instance variables:]
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    49
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    50
    [class variables:]
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    51
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    52
    [see also:]
10280
acca50cc0f17 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    53
        String Unicode16String Unicode32Sting
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    54
"
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    55
!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    56
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    57
examples
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    58
"
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    59
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    60
                                                                [exBegin]
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    61
    |stream|
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    62
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    63
    stream := CharacterWriteStream on:(String new:32).
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    64
    stream nextPutAll:'abc'.
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    65
    stream nextPut:(Character value:16r2c00).
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    66
    stream contents inspect
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    67
                                                                [exEnd]
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    68
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    69
"
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    70
! !
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    71
18265
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    72
!CharacterWriteStream class methodsFor:'instance creation'!
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    73
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    74
new
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    75
    "I know, that I operate on strings"
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    76
18282
bf9c9049c781 class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18265
diff changeset
    77
    ^ self on:(String uninitializedNew:10)
18265
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    78
!
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    79
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    80
new:count
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    81
    "I know, that I operate on strings"
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    82
18282
bf9c9049c781 class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18265
diff changeset
    83
    ^ self on:(String uninitializedNew:count)
18265
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    84
! !
e2f8e48223af class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 17622
diff changeset
    85
14607
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    86
!CharacterWriteStream methodsFor:'accessing'!
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    87
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    88
reset
19647
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
    89
    "reset the stream, to write again over the existing (or already written) contents.
14607
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    90
     See the comment in WriteStream>>contents"
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    91
19886
3f66e06fc677 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19647
diff changeset
    92
    "start with 8-bit String again"
14607
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    93
    collection := String new:collection size.
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    94
    currentCharacterSize := collection bitsPerCharacter.
19886
3f66e06fc677 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19647
diff changeset
    95
    position := 0.
14607
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    96
! !
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
    97
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    98
!CharacterWriteStream methodsFor:'private'!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
    99
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   100
characterSizeChangedTo:newCharacterSize size:additionalSize
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   101
    "change aCollection to fit the size of newCharacterSize"
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   102
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   103
    |sz newSz|
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   104
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   105
    currentCharacterSize < newCharacterSize ifTrue:[
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   106
        newSz := sz := collection size.
17622
553ee52df434 class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 15358
diff changeset
   107
        position + additionalSize >= sz ifTrue:[
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   108
            newSz := newSz + additionalSize + 100.          "add some more space, maybe more will be added"
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   109
        ].
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   110
        collection := ((CharacterArray speciesForCharacterSize:newCharacterSize) new:newSz) 
18613
cef8d2d9f29f class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18598
diff changeset
   111
                        replaceFrom:1 to:position with:collection startingAt:1.
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   112
        currentCharacterSize := collection bitsPerCharacter.
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   113
    ].
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   114
! !
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   115
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   116
!CharacterWriteStream methodsFor:'private-accessing'!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   117
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   118
on:aCollection
19647
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   119
    "return a stream for writing into aCollection"
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   120
    
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   121
    currentCharacterSize := aCollection bitsPerCharacter.
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   122
    ^ super on:aCollection.
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   123
!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   124
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   125
on:aCollection from:start to:stop
19647
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   126
    "return a stream for writing into part of aCollection.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   127
     This will position the stream to start writing at start-index,
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   128
     and setup a writeLimit at stop-index.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   129
     Contents after stop-index will not be overwritten."
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   130
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   131
    currentCharacterSize := aCollection bitsPerCharacter.
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   132
    ^ super on:aCollection from:start to:stop.
19647
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   133
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   134
    "notice: only the first 6 characters are overwritten:
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   135
    
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   136
     |str s|
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   137
     str := 'hello world bla'.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   138
     s := CharacterWriteStream on:str from:6 to:11.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   139
     s nextPutAll:'1234567890'.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   140
     str
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   141
    "
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   142
!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   143
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   144
with:aCollection
19647
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   145
    "return a stream for writing into aCollection.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   146
     This will position the stream to the end, and append written elements
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   147
     after the initial contents.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   148
     I.e. the effect is similar to creating an empty stream first and then write
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   149
     aCollection."
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   150
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   151
    currentCharacterSize := aCollection bitsPerCharacter.
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   152
    ^ super with:aCollection.
19647
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   153
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   154
    "
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   155
     |s|
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   156
     s := CharacterWriteStream with:'hello'.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   157
     s nextPutAll:'1234567890'.
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   158
     s contents
25297b59a272 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 18796
diff changeset
   159
    "
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   160
! !
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   161
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   162
!CharacterWriteStream methodsFor:'writing'!
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   163
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   164
next:count put:aCharacter
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   165
    "append anObject count times to the receiver.
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   166
     Redefined to avoid count grows of the underlying collection -
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   167
     instead a single grow on the final size is performed."
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   168
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   169
    |needCharacterSize|
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   170
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   171
    needCharacterSize := aCharacter characterSize.
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   172
    needCharacterSize > currentCharacterSize ifTrue:[
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   173
        self characterSizeChangedTo:needCharacterSize size:count.
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   174
    ].
12133
d2d08ea77b8c changed:
Claus Gittinger <cg@exept.de>
parents: 11319
diff changeset
   175
    super next:count put:aCharacter
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   176
!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   177
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   178
nextPut:aCharacter
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   179
    "append the argument, aCharacter to the stream.
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   180
     Specially tuned for appending to String, Unicode16String and Unicode32String streams."
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   181
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
%{  /* NOCONTEXT */
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
#ifndef NO_PRIM_STREAM
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   185
    OBJ coll = __INST(collection);
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   186
    OBJ p = __INST(position);
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   188
    if (__isNonNilObject(coll) && __isSmallInteger(p) && __isCharacter(aCharacter)) {
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   189
        REGISTER int pos = __intVal(p) + 1;      /* make 1-based */
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   190
        OBJ wL = __INST(writeLimit);
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   191
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   192
        if ((wL == nil)
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   193
         || (__isSmallInteger(wL) && (pos <= __intVal(wL)))) {
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   194
            OBJ cls = __qClass(coll);
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   195
            unsigned ch = __intVal(__characterVal(aCharacter));
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   196
            OBJ rL = __INST(readLimit);
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   197
            int __readLimit = -1;
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   198
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   199
            if (__isSmallInteger(rL)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   200
                __readLimit = __intVal(rL);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   201
            }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   202
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   203
            if (cls == @global(String)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   204
                if (ch > 0xFF) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   205
                    goto resize;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   206
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   207
                if (pos <= __stringSize(coll)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   208
                    __StringInstPtr(coll)->s_element[pos-1] = ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   209
                    if ((__readLimit >= 0) && (pos >= __readLimit)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8321
diff changeset
   210
                        __INST(readLimit) = __mkSmallInteger(pos);
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   211
                    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8321
diff changeset
   212
                    __INST(position) = __mkSmallInteger(__intVal(__INST(position)) + 1);
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   213
                    RETURN ( aCharacter );
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   214
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   215
            } else if (cls == @global(Unicode16String)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   216
                if (ch > 0xFFFF) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   217
                    goto resize;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   218
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   219
                if (pos <= __unicode16StringSize(coll)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   220
                     __Unicode16StringInstPtr(coll)->s_element[pos-1] = ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   221
                    if ((__readLimit >= 0) && (pos >= __readLimit)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8321
diff changeset
   222
                        __INST(readLimit) = __mkSmallInteger(pos);
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   223
                    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8321
diff changeset
   224
                    __INST(position) = __mkSmallInteger(__intVal(__INST(position)) + 1);
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   225
                    RETURN ( aCharacter );
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   226
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   227
            } else if (cls == @global(Unicode32String)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   228
                if ((pos <= __unicode32StringSize(coll))) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   229
                     __Unicode32StringInstPtr(coll)->s_element[pos-1] = ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   230
                    if ((__readLimit >= 0) && (pos >= __readLimit)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8321
diff changeset
   231
                        __INST(readLimit) = __mkSmallInteger(pos);
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   232
                    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8321
diff changeset
   233
                    __INST(position) = __mkSmallInteger(__intVal(__INST(position)) + 1);
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   234
                    RETURN ( aCharacter );
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   235
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   236
            }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   237
        }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   238
    }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   239
    resize:;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   240
#endif
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   241
%}.
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   242
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   243
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   244
    (writeLimit isNil
15349
7c2c460c5feb class: CharacterWriteStream
Claus Gittinger <cg@exept.de>
parents: 14607
diff changeset
   245
     or:[(position + 1) <= writeLimit]) ifTrue:[
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   246
        |needCharacterSize|
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   247
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   248
        needCharacterSize := aCharacter characterSize.
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   249
        needCharacterSize > currentCharacterSize ifTrue:[
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   250
            self characterSizeChangedTo:needCharacterSize size:1.
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   251
        ] ifFalse:[
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   252
            (position >= collection size) ifTrue:[self growCollection].
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   253
        ].
15349
7c2c460c5feb class: CharacterWriteStream
Claus Gittinger <cg@exept.de>
parents: 14607
diff changeset
   254
        collection at:(position + 1) put:aCharacter.
15358
6b69ebd9785c class: CharacterWriteStream
Claus Gittinger <cg@exept.de>
parents: 15349
diff changeset
   255
        (position >= readLimit) ifTrue:[readLimit := (position + 1)].
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   256
        position := position + 1.
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   257
    ] ifFalse:[
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   258
        WriteError raiseErrorString:'write beyond writeLimit'
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   259
    ].
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   260
    ^ aCharacter
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   261
!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   262
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   263
nextPutAll:aCollection
11319
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   264
    "append aCollection to the receiver.
22419
51057387bc92 #DOCUMENTATION by mawalch
mawalch
parents: 19886
diff changeset
   265
     Redefined to convert to a string of the needed character size."
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   266
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   267
    |needCharacterSize|
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   268
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   269
    needCharacterSize := aCollection characterSize.
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   270
    needCharacterSize > currentCharacterSize ifTrue:[
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   271
        self characterSizeChangedTo:needCharacterSize size:aCollection size.
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   272
    ].
12133
d2d08ea77b8c changed:
Claus Gittinger <cg@exept.de>
parents: 11319
diff changeset
   273
    super nextPutAll:aCollection
22419
51057387bc92 #DOCUMENTATION by mawalch
mawalch
parents: 19886
diff changeset
   274
51057387bc92 #DOCUMENTATION by mawalch
mawalch
parents: 19886
diff changeset
   275
    "Modified (comment): / 15-01-2018 / 08:29:39 / mawalch"
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   276
!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   277
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   278
nextPutAll:aCollection startingAt:start to:stop
24029
b34b5808b448 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23541
diff changeset
   279
    "append the elements from first index to last index
b34b5808b448 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23541
diff changeset
   280
     of the argument, aCollection onto the receiver (i.e. both outstreams)"
b34b5808b448 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23541
diff changeset
   281
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   282
    |needCharacterSize|
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   283
22675
92533fa8cce5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22419
diff changeset
   284
    aCollection isCharacters ifFalse:[
92533fa8cce5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22419
diff changeset
   285
        aCollection isByteArray ifTrue:[
23541
3c2664f7a8cc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 22675
diff changeset
   286
            super nextPutAll:aCollection startingAt:start to:stop
22675
92533fa8cce5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22419
diff changeset
   287
        ]
92533fa8cce5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22419
diff changeset
   288
    ].
92533fa8cce5 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 22419
diff changeset
   289
18598
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   290
    needCharacterSize := aCollection characterSize.
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   291
    needCharacterSize > currentCharacterSize ifTrue:[
913ebad954df class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18590
diff changeset
   292
        self characterSizeChangedTo:needCharacterSize size:stop-start+1.
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   293
    ].
23541
3c2664f7a8cc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 22675
diff changeset
   294
    super nextPutAll:aCollection startingAt:start to:stop
3c2664f7a8cc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 22675
diff changeset
   295
3c2664f7a8cc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 22675
diff changeset
   296
    "Modified: / 22-11-2018 / 12:53:10 / Stefan Vogel"
24029
b34b5808b448 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 23541
diff changeset
   297
    "Modified (comment): / 01-04-2019 / 17:13:06 / Claus Gittinger"
11319
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   298
!
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   299
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   300
nextPutAllUnicode:aCollection
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   301
    ^ self nextPutAll:aCollection
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   302
!
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   303
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   304
nextPutUnicode:aCharacter
18aa6ff91d1e Unicode handling:
Stefan Vogel <sv@exept.de>
parents: 10846
diff changeset
   305
    ^ self nextPut:aCharacter
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   306
! !
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   307
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   308
!CharacterWriteStream class methodsFor:'documentation'!
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   309
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   310
version
18590
7528bf27e91c class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18282
diff changeset
   311
    ^ '$Header$'
12133
d2d08ea77b8c changed:
Claus Gittinger <cg@exept.de>
parents: 11319
diff changeset
   312
!
d2d08ea77b8c changed:
Claus Gittinger <cg@exept.de>
parents: 11319
diff changeset
   313
d2d08ea77b8c changed:
Claus Gittinger <cg@exept.de>
parents: 11319
diff changeset
   314
version_CVS
18590
7528bf27e91c class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 18282
diff changeset
   315
    ^ '$Header$'
8321
eb23a697cd98 Working version
Stefan Vogel <sv@exept.de>
parents: 8299
diff changeset
   316
! !
14607
139c669b52ba class: CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 12133
diff changeset
   317