CharacterWriteStream.st
author Stefan Vogel <sv@exept.de>
Tue, 06 Apr 2004 21:06:48 +0200
changeset 8299 7930ef8d5298
parent 8298 89c57baf93c5
child 8321 eb23a697cd98
permissions -rw-r--r--
Add CharacterWriteStream
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
'From Smalltalk/X, Version:5.2.2 on 06-04-2004 at 17:40:13'                     !
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
8299
7930ef8d5298 Add CharacterWriteStream
Stefan Vogel <sv@exept.de>
parents: 8298
diff changeset
     3
"{ Package: 'stx:libbasic' }"
8298
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
WriteStream subclass:#CharacterWriteStream
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'currentCharacterSize'
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
	category:'Streams'
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
!
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
!CharacterWriteStream methodsFor:'writing'!
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
nextPut:anObject
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
    "append the argument, anObject to the stream.
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
     Specially tuned for appending to String, ByteArray and Array streams."
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    18
%{  /* NOCONTEXT */
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
#ifndef NO_PRIM_STREAM
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
    REGISTER int pos;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
    unsigned ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
    OBJ coll;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
    OBJ p, wL, rL;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
    int __readLimit = -1;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    26
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
    coll = __INST(collection);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
    p = __INST(position);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
    if (__isNonNilObject(coll) && __isSmallInteger(p) && __isCharacter(anObject)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
        pos = __intVal(p);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
        /* make 1-based */
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
        pos = pos + 1 - __intVal( @global(PositionableStream:ZeroPosition));
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    34
        wL = __INST(writeLimit);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    35
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    36
        if ((wL == nil)
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    37
         || (__isSmallInteger(wL) && (pos <= __intVal(wL)))) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    38
            OBJ cls;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    39
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    40
            cls = __qClass(coll);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    41
            ch = __intVal(__characterVal(anObject));
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    42
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    43
            rL = __INST(readLimit);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    44
            if (__isSmallInteger(rL)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    45
                __readLimit = __intVal(rL);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    46
            }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    47
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    48
            if (cls == @global(String)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    49
                if (ch > 0xFF) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    50
                    goto resize;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    51
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
                if (pos <= __stringSize(coll)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
                    __StringInstPtr(coll)->s_element[pos-1] = ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
                    if ((__readLimit >= 0) && (pos >= __readLimit)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
                        __INST(readLimit) = __MKSMALLINT(pos);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
                    }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
                    __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + 1);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
                    RETURN ( anObject );
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
            } else if (cls == @global(Unicode16String)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
                if (ch > 0xFFFF) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    62
                    goto resize;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    63
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    64
                if (pos <= __unicode16StringSize(coll)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    65
                     __Unicode16StringInstPtr(coll)->s_element[pos-1] = ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    66
                    if ((__readLimit >= 0) && (pos >= __readLimit)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    67
                        __INST(readLimit) = __MKSMALLINT(pos);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
                    }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    69
                    __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + 1);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
                    RETURN ( anObject );
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
            } else if (cls == @global(Unicode32String)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
                if ((pos <= __unicode32StringSize(coll))) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
                     __Unicode32StringInstPtr(coll)->s_element[pos-1] = ch;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
                    if ((__readLimit >= 0) && (pos >= __readLimit)) {
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
                        __INST(readLimit) = __MKSMALLINT(pos);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
                    }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
                    __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + 1);
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
                    RETURN ( anObject );
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
                }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
            }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
        }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
    }
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
    resize:;
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
#endif
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
%}.
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
    (writeLimit isNil
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
    or:[(position + 1 - ZeroPosition) <= writeLimit]) ifTrue:[
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
        ((position + 1 - ZeroPosition) > collection size) ifTrue:[self growCollection].
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
        collection at:(position + 1 - ZeroPosition) put:anObject.
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
        ((position + 1 - ZeroPosition) > readLimit) ifTrue:[readLimit := (position + 1 - ZeroPosition)].
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    93
        position := position + 1.
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
    ] ifFalse:[
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
        WriteErrorSignal raiseErrorString:'write beyond writeLimit'
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    96
    ].
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
    ^anObject
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
! !
89c57baf93c5 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99