ByteArray.st
author claus
Fri, 25 Feb 1994 13:58:55 +0100
changeset 54 06dbdeeed4f9
parent 37 d9a302eaa3ef
child 68 59faa75185ba
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
10
claus
parents: 5
diff changeset
    13
ArrayedCollection variableByteSubclass:#ByteArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Collections-Indexed'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
ByteArray comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1989 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
ByteArrays store integers in the range 0..255
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
unlike Smalltalk/80, my ByteArrays have fixed size - may change
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    28
$Header: /cvs/stx/stx/libbasic/ByteArray.st,v 1.8 1994-02-25 12:54:53 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
written spring 89 by claus
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    33
!ByteArray class methodsFor:'queries'!
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    34
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    35
isBuiltInClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    36
    "this class is known by the run-time-system"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    37
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    38
    ^ self == ByteArray
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    39
! !
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    40
2
claus
parents: 1
diff changeset
    41
!ByteArray class methodsFor: 'binary storage'!
claus
parents: 1
diff changeset
    42
claus
parents: 1
diff changeset
    43
binaryDefinitionFrom: stream manager: manager
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    44
    "get a ByteArray from the binary stream.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    45
     ByteArrays are stored as 4-byte size, followed by the bytes"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    46
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    47
    "take care of subclasses ..."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    48
    self == ByteArray ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    49
        ^ (stream next: (stream nextNumber: 4))
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    50
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
    51
    ^ super binaryDefinitionFrom: stream manager: manager
2
claus
parents: 1
diff changeset
    52
! !
claus
parents: 1
diff changeset
    53
10
claus
parents: 5
diff changeset
    54
!ByteArray methodsFor:'resizing'!
claus
parents: 5
diff changeset
    55
claus
parents: 5
diff changeset
    56
grow:sizeIncr
claus
parents: 5
diff changeset
    57
    "report an error - ByteArrays cannot grow"
claus
parents: 5
diff changeset
    58
claus
parents: 5
diff changeset
    59
    self fixedSizeError
claus
parents: 5
diff changeset
    60
! !
claus
parents: 5
diff changeset
    61
2
claus
parents: 1
diff changeset
    62
!ByteArray methodsFor: 'binary storage'!
claus
parents: 1
diff changeset
    63
claus
parents: 1
diff changeset
    64
storeBinaryDefinitionOn: stream manager: manager
37
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    65
    "append a binary representation of the receiver onto stream.
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    66
     Redefined since ByteArrays are stored with a special type code and
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    67
     in a more compact way."
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    68
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    69
    "not, if I have named instance variables"
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    70
    self class instSize ~~ 0 ifTrue:[
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    71
        ^ super storeBinaryDefinitionOn: stream manager: manager
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    72
    ].
2
claus
parents: 1
diff changeset
    73
    manager putIdOf: self class on: stream.
claus
parents: 1
diff changeset
    74
    stream nextNumber: 4 put: self basicSize.
37
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
    75
    stream nextPutAll: self asByteArray
2
claus
parents: 1
diff changeset
    76
! !
claus
parents: 1
diff changeset
    77
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
!ByteArray class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
uninitializedNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
    "return a new instance of the receiver with uninitialized
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
     (i.e. undefined) contents. The indexed elements have any random
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
     value. use, when contents will be set anyway shortly after."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
    OBJ newobj;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
    INT instsize, nInstVars, nindexedinstvars;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
    REGISTER OBJ *op;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
    extern OBJ new();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
    if (_isSmallInteger(anInteger)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
        nindexedinstvars = _intVal(anInteger);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
        if (nindexedinstvars >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
            nInstVars = _intVal(_ClassInstPtr(self)->c_ninstvars);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
            if ((_intVal(_ClassInstPtr(self)->c_flags) & ARRAYMASK) == BYTEARRAY) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
                instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(char);
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
    97
                PROTECT_CONTEXT
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
                _qNew(newobj, instsize, SENDER);
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
    99
                UNPROTECT_CONTEXT
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   100
                if (newobj) {
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   101
                    _InstPtr(newobj)->o_class = self;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
#if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES)
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   103
                    /*
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   104
                     * knowing that nil is 0
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   105
                     */
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   106
                    memset(_InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
#else
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   108
                    op = _InstPtr(newobj)->i_instvars;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   109
                    while (nInstVars--)
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   110
                        *op++ = nil;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
#endif
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   112
                    RETURN ( newobj );
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   113
                }
10
claus
parents: 5
diff changeset
   114
            }
claus
parents: 5
diff changeset
   115
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
.
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   119
    (anInteger isMemberOf:SmallInteger) ifTrue:[
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   120
        (anInteger < 0) ifTrue:[
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   121
            self error:'bad (negative) argument to new'
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   122
        ] ifFalse:[
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   123
            ObjectMemory allocationFailureSignal raise.
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   124
        ].
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   125
        ^ nil
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   126
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    ^ self basicNew:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
!ByteArray methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
basicAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
    "return the indexed instance variable with index, anInteger
2
claus
parents: 1
diff changeset
   135
     - redefined here to be slighly faster than the default in Object"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    REGISTER int indx;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    int nIndex;
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   141
    OBJ cls;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
2
claus
parents: 1
diff changeset
   143
    if (_isSmallInteger(index)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
        indx = _intVal(index);
2
claus
parents: 1
diff changeset
   145
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   146
        if ((cls = _qClass(self)) != ByteArray)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   147
            indx += _intVal(_ClassInstPtr(cls)->c_ninstvars) * sizeof(OBJ);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
        nIndex = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
        if ((indx > 0) && (indx <= nIndex)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
            RETURN ( _MKSMALLINT(_ByteArrayInstPtr(self)->ba_element[indx - 1]) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    ^ super basicAt:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
basicAt:index put:value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
    "set the indexed instance variable with index, anInteger to value
2
claus
parents: 1
diff changeset
   160
     - redefined here to be slighly faster than the default in Object"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    REGISTER int indx;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    int nIndex;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
    int val;
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   167
    OBJ cls;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
2
claus
parents: 1
diff changeset
   169
    if (_isSmallInteger(index) && _isSmallInteger(value)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
        val = _intVal(value);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
        if ((val >= 0) && (val <= 255)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
            indx = _intVal(index);
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   173
            if ((cls = _qClass(self)) != ByteArray)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   174
                indx += _intVal(_ClassInstPtr(cls)->c_ninstvars) * sizeof(OBJ);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
            nIndex = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
            if ((indx > 0) && (indx <= nIndex)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
                _ByteArrayInstPtr(self)->ba_element[indx - 1] = val;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
                RETURN ( value );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
    ^ super basicAt:index put:value
2
claus
parents: 1
diff changeset
   185
!
claus
parents: 1
diff changeset
   186
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   187
byteAt:index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   188
    "return the byte at index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   189
     - for ST-80 compatibility"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   190
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   191
    ^ self at:index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   192
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   193
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   194
byteAt:index put:aByteValuedInteger
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   195
    "return the byte at index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   196
     - for ST-80 compatibility"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   197
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   198
    ^ self at:index put:aByteValuedInteger
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   199
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   200
2
claus
parents: 1
diff changeset
   201
wordAt:index
claus
parents: 1
diff changeset
   202
    "return the 2-bytes starting at index as an (unsigned) Integer.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   203
     Question: should it be signed ?"
2
claus
parents: 1
diff changeset
   204
claus
parents: 1
diff changeset
   205
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   206
claus
parents: 1
diff changeset
   207
    REGISTER int indx;
claus
parents: 1
diff changeset
   208
    int nIndex;
claus
parents: 1
diff changeset
   209
    int val;
claus
parents: 1
diff changeset
   210
    extern OBJ _makeLarge();
claus
parents: 1
diff changeset
   211
claus
parents: 1
diff changeset
   212
    if (_isSmallInteger(index)) {
claus
parents: 1
diff changeset
   213
        indx = _intVal(index);
claus
parents: 1
diff changeset
   214
        if (_qClass(self) != ByteArray)
claus
parents: 1
diff changeset
   215
            indx += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
claus
parents: 1
diff changeset
   216
        nIndex = _qSize(self) - OHDR_SIZE;
claus
parents: 1
diff changeset
   217
        if ((indx > 0) && ((indx+1) <= nIndex)) {
10
claus
parents: 5
diff changeset
   218
            val = _ByteArrayInstPtr(self)->ba_element[indx+1-1];
claus
parents: 5
diff changeset
   219
            val = (val << 8) + _ByteArrayInstPtr(self)->ba_element[indx-1];
2
claus
parents: 1
diff changeset
   220
            RETURN ( _MKSMALLINT(val) );
claus
parents: 1
diff changeset
   221
        }
claus
parents: 1
diff changeset
   222
    }
claus
parents: 1
diff changeset
   223
%}
claus
parents: 1
diff changeset
   224
.
claus
parents: 1
diff changeset
   225
    ^ ((self at:index+1) * 256) + (self at:index)
claus
parents: 1
diff changeset
   226
!
claus
parents: 1
diff changeset
   227
claus
parents: 1
diff changeset
   228
wordAt:index put:value
claus
parents: 1
diff changeset
   229
    "set the 2-bytes starting at index from the (unsigned) Integer value.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   230
     Question: should it be signed ?"
2
claus
parents: 1
diff changeset
   231
claus
parents: 1
diff changeset
   232
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   233
claus
parents: 1
diff changeset
   234
    REGISTER int indx;
claus
parents: 1
diff changeset
   235
    int nIndex;
claus
parents: 1
diff changeset
   236
    int val;
claus
parents: 1
diff changeset
   237
    extern OBJ _makeLarge();
claus
parents: 1
diff changeset
   238
claus
parents: 1
diff changeset
   239
    if (_isSmallInteger(index) && _isSmallInteger(value)) {
claus
parents: 1
diff changeset
   240
        indx = _intVal(index);
claus
parents: 1
diff changeset
   241
        if (_qClass(self) != ByteArray)
claus
parents: 1
diff changeset
   242
            indx += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
claus
parents: 1
diff changeset
   243
        nIndex = _qSize(self) - OHDR_SIZE;
claus
parents: 1
diff changeset
   244
        if ((indx > 0) && ((indx+1) <= nIndex)) {
10
claus
parents: 5
diff changeset
   245
            val = _intVal(value);
claus
parents: 5
diff changeset
   246
            if ((val >= 0) && (val <= 0xFFFF)) {
claus
parents: 5
diff changeset
   247
                _ByteArrayInstPtr(self)->ba_element[indx-1] = val & 0xFF;
claus
parents: 5
diff changeset
   248
                val >>= 8;
claus
parents: 5
diff changeset
   249
                _ByteArrayInstPtr(self)->ba_element[indx+1-1] = val & 0xFF;
2
claus
parents: 1
diff changeset
   250
                RETURN ( value );
claus
parents: 1
diff changeset
   251
            }
claus
parents: 1
diff changeset
   252
        }
claus
parents: 1
diff changeset
   253
    }
claus
parents: 1
diff changeset
   254
%}
claus
parents: 1
diff changeset
   255
.
claus
parents: 1
diff changeset
   256
    (value < 0) ifTrue:[
10
claus
parents: 5
diff changeset
   257
        ^ self elementBoundsError
2
claus
parents: 1
diff changeset
   258
    ].
claus
parents: 1
diff changeset
   259
    self at:index put:(value \\ 256).
claus
parents: 1
diff changeset
   260
    self at:index + 1 put:(value // 256).
claus
parents: 1
diff changeset
   261
    ^ value
claus
parents: 1
diff changeset
   262
!
claus
parents: 1
diff changeset
   263
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   264
signedWordAt:index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   265
    "return the 2-bytes starting at index as a signed Integer."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   266
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   267
    |w|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   268
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   269
    w := self wordAt:index.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   270
    (w > 16r7FFF) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   271
        ^ w - 16r10000
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   272
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   273
    ^ w
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   274
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   275
    "
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   276
    |b|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   277
    b := ByteArray new:4.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   278
    b signedWordAt:1 put:-1.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   279
    b wordAt:1
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   280
    "
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   281
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   282
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   283
signedWordAt:index put:value
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   284
    "set the 2-bytes starting at index from the signed Integer value."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   285
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   286
    value > 0 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   287
        ^ self wordAt:index put:value
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   288
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   289
    ^ self wordAt:index put:(16r10000 + value)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   290
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   291
2
claus
parents: 1
diff changeset
   292
doubleWordAt:index
claus
parents: 1
diff changeset
   293
    "return the 4-bytes starting at index as an (unsigned) Integer.
claus
parents: 1
diff changeset
   294
     question: should it be signed ?"
claus
parents: 1
diff changeset
   295
claus
parents: 1
diff changeset
   296
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   297
claus
parents: 1
diff changeset
   298
    REGISTER int indx;
claus
parents: 1
diff changeset
   299
    int nIndex;
claus
parents: 1
diff changeset
   300
    int val;
claus
parents: 1
diff changeset
   301
    extern OBJ _makeLarge();
claus
parents: 1
diff changeset
   302
claus
parents: 1
diff changeset
   303
    if (_isSmallInteger(index)) {
claus
parents: 1
diff changeset
   304
        indx = _intVal(index);
claus
parents: 1
diff changeset
   305
        if (_qClass(self) != ByteArray)
claus
parents: 1
diff changeset
   306
            indx += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
claus
parents: 1
diff changeset
   307
        nIndex = _qSize(self) - OHDR_SIZE;
claus
parents: 1
diff changeset
   308
        if ((indx > 0) && ((indx+3) <= nIndex)) {
10
claus
parents: 5
diff changeset
   309
            val = _ByteArrayInstPtr(self)->ba_element[indx+3-1];
claus
parents: 5
diff changeset
   310
            val = (val << 8) + _ByteArrayInstPtr(self)->ba_element[indx+2-1];
claus
parents: 5
diff changeset
   311
            val = (val << 8) + _ByteArrayInstPtr(self)->ba_element[indx+1-1];
claus
parents: 5
diff changeset
   312
            val = (val << 8) + _ByteArrayInstPtr(self)->ba_element[indx-1];
claus
parents: 5
diff changeset
   313
            if ((val >= 0) && (val <= _MAX_INT)) {
2
claus
parents: 1
diff changeset
   314
                RETURN ( _MKSMALLINT(val) );
claus
parents: 1
diff changeset
   315
            }
claus
parents: 1
diff changeset
   316
        }
claus
parents: 1
diff changeset
   317
    }
claus
parents: 1
diff changeset
   318
%}
claus
parents: 1
diff changeset
   319
.
claus
parents: 1
diff changeset
   320
    ^ ((self wordAt:index+2) * (256 *256)) + (self wordAt:index)
claus
parents: 1
diff changeset
   321
!
claus
parents: 1
diff changeset
   322
claus
parents: 1
diff changeset
   323
doubleWordAt:index put:value
claus
parents: 1
diff changeset
   324
    "set the 4-bytes starting at index from the (unsigned) Integer value.
claus
parents: 1
diff changeset
   325
     question: should it be signed ?"
claus
parents: 1
diff changeset
   326
claus
parents: 1
diff changeset
   327
    |t|
claus
parents: 1
diff changeset
   328
claus
parents: 1
diff changeset
   329
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   330
claus
parents: 1
diff changeset
   331
    REGISTER int indx;
claus
parents: 1
diff changeset
   332
    int nIndex;
claus
parents: 1
diff changeset
   333
    int val;
claus
parents: 1
diff changeset
   334
    extern OBJ _makeLarge();
claus
parents: 1
diff changeset
   335
claus
parents: 1
diff changeset
   336
    if (_isSmallInteger(index) && _isSmallInteger(value)) {
10
claus
parents: 5
diff changeset
   337
        val = _intVal(value);
claus
parents: 5
diff changeset
   338
        if (val >= 0) {
2
claus
parents: 1
diff changeset
   339
            indx = _intVal(index);
claus
parents: 1
diff changeset
   340
            if (_qClass(self) != ByteArray)
claus
parents: 1
diff changeset
   341
                indx += _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
claus
parents: 1
diff changeset
   342
            nIndex = _qSize(self) - OHDR_SIZE;
claus
parents: 1
diff changeset
   343
            if ((indx > 0) && ((indx+3) <= nIndex)) {
10
claus
parents: 5
diff changeset
   344
                _ByteArrayInstPtr(self)->ba_element[indx-1] = val & 0xFF;
claus
parents: 5
diff changeset
   345
                val >>= 8;
claus
parents: 5
diff changeset
   346
                _ByteArrayInstPtr(self)->ba_element[indx+1-1] = val & 0xFF;
claus
parents: 5
diff changeset
   347
                val >>= 8;
claus
parents: 5
diff changeset
   348
                _ByteArrayInstPtr(self)->ba_element[indx+2-1] = val & 0xFF;
claus
parents: 5
diff changeset
   349
                val >>= 8;
claus
parents: 5
diff changeset
   350
                _ByteArrayInstPtr(self)->ba_element[indx+3-1] = val & 0xFF;
2
claus
parents: 1
diff changeset
   351
                RETURN ( value );
claus
parents: 1
diff changeset
   352
            }
claus
parents: 1
diff changeset
   353
        }
claus
parents: 1
diff changeset
   354
    }
claus
parents: 1
diff changeset
   355
%}
claus
parents: 1
diff changeset
   356
.
claus
parents: 1
diff changeset
   357
    (value < 0) ifTrue:[
10
claus
parents: 5
diff changeset
   358
        ^ self elementBoundsError
2
claus
parents: 1
diff changeset
   359
    ].
claus
parents: 1
diff changeset
   360
    t := value // (256 * 256).
claus
parents: 1
diff changeset
   361
    self wordAt:(index+2) put:t.
claus
parents: 1
diff changeset
   362
    self wordAt:(index) put:(value - (t * 256 * 256)).
claus
parents: 1
diff changeset
   363
    ^ value
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   364
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   365
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   366
signedDoubleWordAt:index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   367
    "return the 4-bytes starting at index as a signed Integer."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   368
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   369
    |w|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   370
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   371
    "stupid: due to an STC bug, cannot currently have LargeInteger
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   372
     constants - change when fixed ..."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   373
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   374
    w := self doubleWordAt:index.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   375
    (w > (16r7FFFFFF * 16r10 + 16rF)) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   376
        ^ w - (16r10000000 * 16r10)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   377
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   378
    ^ w
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   379
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   380
"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   381
    w := self doubleWordAt:index.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   382
    (w > 16r7FFFFFFF) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   383
        ^ w - 16r100000000
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   384
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   385
    ^ w
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   386
"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   387
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   388
    "
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   389
    |b|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   390
    b := ByteArray new:4.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   391
    b signedDoubleWordAt:1 put:-1.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   392
    b doubleWordAt:1
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   393
    "
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   394
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   395
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   396
signedDoubleWordAt:index put:value
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   397
    "set the 4-bytes starting at index from the signed Integer value."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   398
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   399
    value > 0 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   400
        ^ self doubleWordAt:index put:value
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   401
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   402
    "stupid: due to an STC bug, cannot currently have LargeInteger
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   403
     constants - change when fixed ..."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   404
    ^ self doubleWordAt:index put:((16r10000000 * 16r10) + value)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   405
"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   406
    ^ self doubleWordAt:index put:(16r100000000 + value)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   407
"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   408
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   409
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   410
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   411
floatAt:index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   412
    "return the 4-bytes starting at index as a Float.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   413
     Notice, that (currently) ST/X Floats are what Doubles are in ST-80.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   414
     Notice also, that the bytes are expected to be in this machines
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   415
     float representation - if the bytearray originated from another
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   416
     machine, some conversion is usually needed."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   417
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   418
    |newFloat|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   419
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   420
    newFloat := Float basicNew.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   421
    UninterpretedBytes isBigEndian ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   422
        5 to:8 do:[:destIndex|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   423
            newFloat basicAt:destIndex put:(self at:index - 5 + destIndex)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   424
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   425
    ] ifFalse:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   426
        1 to:4 do:[:destIndex|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   427
            newFloat basicAt:destIndex put:(self at:index - 1 + destIndex)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   428
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   429
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   430
    ^ newFloat.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   431
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   432
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   433
floatAt:index put:aFloat
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   434
    "store the 4 bytes of value of the argument, aFloat into the receiver
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   435
     starting at index.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   436
     Notice, that (currently) ST/X Floats are what DOubles are in ST-80.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   437
     Notice also, that the bytes are expected to be in this machines
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   438
     float representation - if the bytearray originated from another
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   439
     machine, some conversion is usually needed."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   440
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   441
    UninterpretedBytes isBigEndian ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   442
        5 to:8 do:[:srcIndex|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   443
            self at:index - 5 + srcIndex put:(aFloat basicAt:srcIndex)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   444
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   445
    ] ifFalse:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   446
        1 to:4 do:[:srcIndex|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   447
            self at:index - 1 + srcIndex put:(aFloat basicAt:srcIndex)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   448
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   449
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   450
    ^ aFloat
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   451
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   452
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   453
doubleAt:index
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   454
    "return the 8-bytes starting at index as a Float.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   455
     Notice, that (currently) ST/X Floats are what Doubles are in ST-80.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   456
     Notice also, that the bytes are expected to be in this machines
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   457
     float representation - if the bytearray originated from another
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   458
     machine, some conversion is usually needed."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   459
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   460
    |newFloat|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   461
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   462
    newFloat := Float basicNew.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   463
    1 to:8 do:[:destIndex|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   464
        newFloat basicAt:destIndex put:(self at:index - 1 + destIndex)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   465
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   466
    ^ newFloat.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   467
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   468
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   469
doubleAt:index put:aFloat
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   470
    "store the value of the argument, aFloat into the receiver
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   471
     starting at index.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   472
     Notice, that (currently) ST/X Floats are what Doubles are in ST-80.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   473
     Notice also, that the bytes are expected to be in this machines
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   474
     float representation - if the bytearray originated from another
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   475
     machine, some conversion is usually needed."
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   476
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   477
    1 to:8 do:[:srcIndex|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   478
        self at:index - 1 + srcIndex put:(aFloat basicAt:srcIndex)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   479
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   480
    ^ aFloat
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   483
!ByteArray methodsFor:'converting'!
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   484
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   485
asByteArray
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   486
    "return the receiver as a byteArray"
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   487
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   488
    "could be an instance of a subclass..."
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   489
    self class == ByteArray ifTrue:[
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   490
        ^ self
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   491
    ].
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   492
    ^ super asByteArray
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   493
! !
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   494
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   495
!ByteArray methodsFor:'printing & storing'!
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   496
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   497
isLiteral
37
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
   498
    "return true, if the receiver can be used as a literal
d9a302eaa3ef *** empty log message ***
claus
parents: 12
diff changeset
   499
     (i.e. can be used in constant arrays)"
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   500
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   501
    ^ true
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   502
!
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   503
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   504
storeOn:aStream
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   505
    "append a printed representation from which the receiver can be
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   506
     reconstructed to aStream. (reimplemented to make it look better)"
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   507
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   508
    |first|
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   509
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   510
    self class == ByteArray ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   511
        aStream nextPutAll:'#['.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   512
        first := true.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   513
        self do:[:byte | 
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   514
            first ifFalse:[aStream space]
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   515
                  ifTrue:[first := false].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   516
            byte storeOn:aStream.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   517
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   518
        aStream nextPutAll:']'.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   519
        ^ self
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   520
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   521
    ^ super storeOn:aStream
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   522
! !
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   523
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
!ByteArray methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
indexOf:aByte startingAt:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
    "return the index of the first occurrence of the argument, aByte
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
     in the receiver starting at start, anInteger; return 0 if not found.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
     - reimplemented here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
    REGISTER int index, byteValue;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
    REGISTER int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
    if (! _isSmallInteger(aByte)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
        RETURN ( _MKSMALLINT(0) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
    byteValue = _intVal(aByte);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
    if ((byteValue < 0) || (byteValue > 255)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
        RETURN ( _MKSMALLINT(0) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
2
claus
parents: 1
diff changeset
   547
    if (_isSmallInteger(start)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
        index = _intVal(start);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
        len = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
        cp = &(_ByteArrayInstPtr(self)->ba_element[0]);
2
claus
parents: 1
diff changeset
   551
        if (_qClass(self) != ByteArray) {
10
claus
parents: 5
diff changeset
   552
            int nInst;
2
claus
parents: 1
diff changeset
   553
claus
parents: 1
diff changeset
   554
            nInst = _intVal(_ClassInstPtr(_qClass(self))->c_ninstvars) * sizeof(OBJ);
claus
parents: 1
diff changeset
   555
            cp += nInst;
10
claus
parents: 5
diff changeset
   556
            len -= nInst;
claus
parents: 5
diff changeset
   557
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
        cp += index - 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
        while (index <= len) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
            if (*cp == byteValue) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
                RETURN ( _MKSMALLINT(index) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
            index++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
            cp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
        RETURN ( _MKSMALLINT(0) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
    ^ super indexOf:aByte startingAt:start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
usedValues
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
    "return a new ByteArray with all used values (actually a kind of Set);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
     needed specially for Image class."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
    |result l|
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   578
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   579
%{  /* STACK: 400 */
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   580
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
    REGISTER int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
    unsigned char flags[256];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
    static struct inlineCache nw = _ILC1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
    extern OBJ ByteArray, _new_;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    if (_qClass(self) == ByteArray) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
        memset(flags, 0, sizeof(flags));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
        len = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
        cp = &(_ByteArrayInstPtr(self)->ba_element[0]);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
        /* for each used byte, set flag */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
        while (len > 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
            flags[*cp] = 1;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
            cp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
            len--;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
        /* count 1's */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
        len = 0;
2
claus
parents: 1
diff changeset
   600
        for (cp=flags+255; cp >= flags; cp--)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
            if (*cp) len++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
        /* create ByteArray of used values */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
        result = (*nw.ilc_func)(ByteArray, _new_, CON_COMMA nil, &nw, _MKSMALLINT(len));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
        if (_Class(result) == ByteArray) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
            cp = &(_ByteArrayInstPtr(result)->ba_element[0]);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
            for (len=0; len < 256; len++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
                if (flags[len]) 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
                    *cp++ = len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
        RETURN ( result );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   616
    ^ self asSet
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
usageCounts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
    "return an array filled with value-counts -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
     added for Image handling"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
    |counts|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   624
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
    counts := Array new:256.
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   626
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   627
%{  /* STACK: 2000 */
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   628
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
    REGISTER int nByte;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
    REGISTER int index;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
    int icounts[256];
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   634
    if ((_qClass(self) == ByteArray) && __isArray(counts)) {
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
        /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
         * zero counts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
         */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
        for (index=0; index<256; index++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
            icounts[index] = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
        /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
         * count
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
         */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
        nByte = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
        cp = &(_ByteArrayInstPtr(self)->ba_element[0]);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
        while (nByte--) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
            icounts[*cp++]++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
        /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
         * make it real counts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
         */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
        for (index=0; index<256; index++) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
            _ArrayInstPtr(counts)->a_element[index] = _MKSMALLINT(icounts[index]);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
        RETURN ( counts );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
maximumValue
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
    "return the maximum value in the receiver -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
     added for sound-player (which needs a fast method for this)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
    REGISTER unsigned char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
    REGISTER int index, max;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
    int len;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
    if (_qClass(self) == ByteArray) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
        max = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
        index = 0;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
        len = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
        cp = &(_ByteArrayInstPtr(self)->ba_element[0]);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
        while (++index <= len) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
            if (*cp > max) max = *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
            cp++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
        RETURN ( _MKSMALLINT(max) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
!ByteArray methodsFor:'filling and replacing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
replaceFrom:start to:stop with:aCollection startingAt:repStart
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
    "reimplemented for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   695
%{  /* NOCONTEXT */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   696
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   697
    int nIndex, repNIndex;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   698
    int startIndex, stopIndex;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   699
    REGISTER unsigned char *src;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   700
    REGISTER int repStartIndex;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   701
    int repStopIndex, count;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   702
    REGISTER unsigned char *dst;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   704
    if ((_qClass(self) == ByteArray)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   705
     && (_Class(aCollection) == ByteArray)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   706
     && _isSmallInteger(start)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   707
     && _isSmallInteger(stop)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   708
     && _isSmallInteger(repStart)) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   709
        startIndex = _intVal(start) - 1;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   710
        if (startIndex >= 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   711
          nIndex = _qSize(self) - OHDR_SIZE;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   712
          stopIndex = _intVal(stop) - 1;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   713
          count = stopIndex - startIndex + 1;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   714
          if (count == 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   715
              RETURN ( self );
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   716
          }
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   717
          if ((count > 0) && (stopIndex < nIndex)) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   718
            repStartIndex = _intVal(repStart) - 1;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   719
            if (repStartIndex >= 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   720
              repNIndex = _qSize(aCollection) - OHDR_SIZE;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   721
              repStopIndex = repStartIndex + (stopIndex - startIndex);
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   722
              if (repStopIndex < repNIndex) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   723
                src = &(_ByteArrayInstPtr(aCollection)->ba_element[repStartIndex]);
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   724
                dst = &(_ByteArrayInstPtr(self)->ba_element[startIndex]);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   726
                if (aCollection == self) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   727
                    /* take care of overlapping copy */
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   728
                    if (src < dst) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   729
                        /* must do a reverse copy */
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   730
                        src += count;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   731
                        dst += count;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   732
                        while (count-- > 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   733
                            *--dst = *--src;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
                        }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   735
                        RETURN ( self );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
                    }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   737
                }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
#ifdef FAST_MEMCPY
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   739
                bcopy(src, dst, count);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
#else
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   741
                while (count-- > 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   742
                    *dst++ = *src++;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   743
                }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
#endif
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   745
                RETURN ( self );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
              }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
            }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   748
          }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
        }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   750
    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   752
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
    ^ super replaceFrom:start to:stop with:aCollection startingAt:repStart
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
!ByteArray methodsFor:'image manipulation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   757
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
invert
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
    "invert all bytes - used with image manipulations
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   760
     written as a primitive for speed.
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   761
     Q: is this really needed ?"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
a27a279701f8 Initial revision
claus
parents:
diff changeset
   763
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   764
a27a279701f8 Initial revision
claus
parents:
diff changeset
   765
    REGISTER unsigned char *dst;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   766
    REGISTER unsigned long *ldst;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
    REGISTER int cnt;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   768
a27a279701f8 Initial revision
claus
parents:
diff changeset
   769
    if (_qClass(self) == ByteArray) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   770
        cnt = _qSize(self) - OHDR_SIZE;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   771
        dst = _ByteArrayInstPtr(self)->ba_element;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   772
        if (! ((int)dst & (sizeof(long)-1))) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
            ldst = (unsigned long *)dst;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
            while (cnt >= sizeof(long)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
                *ldst = ~(*ldst);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
                ldst++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   777
                cnt -= sizeof(long);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
            dst = (unsigned char *)ldst;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
        while (cnt--) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
            *dst = ~(*dst);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
            dst++;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
        RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   786
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   789
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   792
reverse
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   793
    "reverse order of elements inplace - 
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   794
     written as a primitive for speed on image manipulations"
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   795
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   796
%{  /* NOCONTEXT */
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   797
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   798
    REGISTER unsigned char *p1, *p2;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   799
    REGISTER int cnt;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   800
    REGISTER unsigned t;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   801
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   802
    if (_qClass(self) == ByteArray) {
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   803
        cnt = _qSize(self) - OHDR_SIZE;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   804
        p1 = _ByteArrayInstPtr(self)->ba_element;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   805
        p2 = _ByteArrayInstPtr(self)->ba_element + cnt - 1;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   806
        while (cnt > 0) {
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   807
            t = *p1;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   808
            *p1++ = *p2;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   809
            *p2-- = t;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   810
            cnt-=2;
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   811
        }
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   812
        RETURN ( self );
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   813
    }
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   814
%}
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   815
.
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   816
    ^ super reverse
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   817
!
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
   818
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   819
expandPixels:nBitsPerPixel width:width height:height into:aByteArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   820
                         mapping:aMapByteArray
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   821
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   822
    "given the receiver with nBitsPerPixel-depth pixels, expand them into
a27a279701f8 Initial revision
claus
parents:
diff changeset
   823
     aByteArray with 8-bit pixels. The width/height-arguments are needed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   824
     to skip any padded src-bits. On the fly, the destination pixels
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   825
     are translated using aMapByteArray if non-nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   826
     - used to display mono, 2-bit and 4-bit bitmaps on grey-scale/color
a27a279701f8 Initial revision
claus
parents:
diff changeset
   827
       machines"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   828
a27a279701f8 Initial revision
claus
parents:
diff changeset
   829
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   830
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   831
    REGISTER unsigned char *src, *dst;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   832
    REGISTER int wrun;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   833
    unsigned char *srcNext;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   834
    int bytesPerRow, mask, shift0, shift;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   835
    int w, h, hrun;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   836
    int srcBytes, dstBytes;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   837
    int bitsPerPixel;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   838
    int bits;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   839
    int ncells;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   840
    unsigned char *map;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   841
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   842
    if ((_qClass(self) == ByteArray) 
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   843
     && (_qClass(aByteArray) == ByteArray)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   844
     && _isSmallInteger(nBitsPerPixel)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   845
     && _isSmallInteger(height)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   846
     && _isSmallInteger(width)) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   847
        if ((aMapByteArray != nil)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   848
         && (_Class(aMapByteArray) == ByteArray)) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   849
            map = _ByteArrayInstPtr(aMapByteArray)->ba_element;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   850
        } else {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   851
            map = (unsigned char *)0;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   852
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   853
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   854
        bitsPerPixel = _intVal(nBitsPerPixel);
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   855
        w = _intVal(width);
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   856
        h = _intVal(height);
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   857
        src = _ByteArrayInstPtr(self)->ba_element;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   858
        dst = _ByteArrayInstPtr(aByteArray)->ba_element;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   859
        switch (bitsPerPixel) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   860
            case 1:
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   861
                mask = 0x01;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   862
                break;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   863
            case 2:
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   864
                mask = 0x03;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   865
                break;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   866
            case 4:
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   867
                mask = 0x0F;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   868
                break;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   869
            case 8:
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   870
                mask = 0xFF;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   871
                break;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   872
            default:
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   873
                goto fail;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   874
        }
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   875
        ncells = mask + 1;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   876
        if (map) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   877
            if ((_qSize(aMapByteArray) - OHDR_SIZE) < ncells)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   878
                goto fail;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   879
        }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   880
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   881
        bytesPerRow = (w * bitsPerPixel + 7) / 8;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   882
        shift0 = 8 - bitsPerPixel;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   883
        srcBytes = bytesPerRow * h;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   884
        dstBytes = w * h;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   885
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   886
        if (((_qSize(self) - OHDR_SIZE) >= srcBytes)
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   887
         && ((_qSize(aByteArray) - OHDR_SIZE) >= dstBytes)) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   888
            for (hrun=h; hrun; hrun--) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   889
                srcNext = src + bytesPerRow;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   890
                shift = shift0;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   891
                if (map) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   892
                    for (wrun=w; wrun; wrun--) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   893
                        if (shift == shift0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   894
                            bits = *src++;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   895
                        }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   896
                        *dst++ = map[(bits >> shift) & mask];
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   897
                        shift -= bitsPerPixel;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   898
                        if (shift < 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   899
                            shift = shift0;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   900
                        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   901
                    }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   902
                } else {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   903
                    for (wrun=w; wrun; wrun--) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   904
                        if (shift == shift0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   905
                            bits = *src++;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   906
                        }
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   907
                        *dst++ = (bits >> shift) & mask;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   908
                        shift -= bitsPerPixel;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   909
                        if (shift < 0) {
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   910
                            shift = shift0;
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   911
                        }
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   912
                    }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   913
                }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   914
                src = srcNext;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   915
            }
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 37
diff changeset
   916
            RETURN ( self );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   917
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   918
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   919
fail: ;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   920
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   921
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   922
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   923
! !