UninterpretedBytes.st
changeset 4308 20585b7ae5e1
parent 4275 9fc4a735a1d3
child 4312 63eb0ccfd909
--- a/UninterpretedBytes.st	Thu Jun 24 00:22:36 1999 +0200
+++ b/UninterpretedBytes.st	Thu Jun 24 09:36:27 1999 +0200
@@ -32,22 +32,22 @@
 #define __fetchBytePointerAndSize__(o, pPtr, pSize) \
     {\
       if (__isNonNilObject(o)) { \
-        if (__qClass(o) == ByteArray) { \
-	  *(pPtr) = (char *)__ByteArrayInstPtr(o)->ba_element; \
+	if (__qClass(o) == ByteArray) { \
+	  *(pPtr) = (unsigned char *)__ByteArrayInstPtr(o)->ba_element; \
 	  *(pSize) = __byteArraySize(o); \
 	} else if (__qClass(o) == ExternalBytes) { \
 	  OBJ __sz__ = __externalBytesSize(o); \
 	  if (__isSmallInteger(__sz__)) { \
 	    *(pSize) = __intVal(__sz__); \
-	    *(pPtr) = (char *)(__externalBytesAddress(o)); \
+	    *(pPtr) = (unsigned char *)(__externalBytesAddress(o)); \
 	  } else { \
-	    *(pPtr) = (char *)0; \
+	    *(pPtr) = (unsigned char *)0; \
 	  } \
 	} else { \
-	    *(pPtr) = (char *)0; \
+	    *(pPtr) = (unsigned char *)0; \
 	} \
       } else { \
-	*(pPtr) = (char *)0; \
+	*(pPtr) = (unsigned char *)0; \
       } \
     }
 
@@ -75,25 +75,25 @@
     UninterpretedBytes provides the common protocol for byte-storage 
     containers; concrete subclasses are 
 	ByteArray (which store the bytes within the
-    		   Smalltalk object memory) 
+		   Smalltalk object memory) 
     and 
 	ExternalBytes (which store the bytes in the malloc-heap).
 
     UninterpretedBytes itself is abstract, so no instances of it can be created.
 
     [See also:]
-        ByteArray String ExternalBytes
+	ByteArray String ExternalBytes
 
     [author:]
-        Claus Gittinger
+	Claus Gittinger
 
     [Notice:]
 	Notice the confusion due to multiple methods with the same
-        functionality (i.e. 'xxxx:MSB:' vs. 'xxxx:bigEndian:').
-        The reason is that at the time this class was written,
-        ST80 sid not offer protocol to specify the byteOrder, and
-        ST/X provided methods ending in 'MSB:' for this.
-        In the meanwhile, VW added protocol ending in 'bigEndian:',
+	functionality (i.e. 'xxxx:MSB:' vs. 'xxxx:bigEndian:').
+	The reason is that at the time this class was written,
+	ST80 sid not offer protocol to specify the byteOrder, and
+	ST/X provided methods ending in 'MSB:' for this.
+	In the meanwhile, VW added protocol ending in 'bigEndian:',
 	which has been added here for compatibility.
 	(certainly a point, where an ansi-standard will help)
 "
@@ -116,7 +116,7 @@
      I.e. false for vax, intel; true for m68k, sun.
 
      Notice: UninterpretedBytes isBigEndian
-             this is inlined both by stc and the jit compiler"
+	     this is inlined both by stc and the jit compiler"
 
 %{  /* NOCONTEXT */
 
@@ -137,8 +137,8 @@
      *    constant for systems where this is known.
      */
     union {
-        unsigned int   u_l;
-        char           u_c[sizeof(int)];
+	unsigned int   u_l;
+	char           u_c[sizeof(int)];
     } u;
 
     u.u_l = 0x87654321;
@@ -242,11 +242,11 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index)) {
-	char *cp;
+	unsigned char *cp;
 	int sz;
-	
+        
 	__fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
+	if (cp) {
 	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
 
 	    if ((idx+(sizeof(double)-1)) < sz) {
@@ -259,7 +259,7 @@
 		    OBJ f;
 
 		    __qMKFLOAT(f, dVal);
-                    RETURN (f);
+		    RETURN (f);
 		}
 	    }
 	}
@@ -293,12 +293,12 @@
     |newFloat|
 
     msb == UninterpretedBytes isBigEndian ifTrue:[
-        ^ self doubleAt:index.
+	^ self doubleAt:index.
     ].
 
     newFloat := Float basicNew.
     1 to:8 do:[:destIndex|
-        newFloat basicAt:(9-destIndex) put:(self at:index - 1 + destIndex)
+	newFloat basicAt:(9-destIndex) put:(self at:index - 1 + destIndex)
     ].
     ^ newFloat.
 
@@ -322,29 +322,29 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index) && __isFloat(flt)) {
-        char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
 
-            if ((idx+(sizeof(double)-1)) < sz) {
-                cp += idx;
-                /*
-                 * aligned
-                 */
-                if (((INT)cp & (sizeof(double)-1)) == 0) {
-                    ((double *)cp)[0] = __floatVal(flt);
-                    RETURN (aFloat);
-                }
-            }
-        }
+	    if ((idx+(sizeof(double)-1)) < sz) {
+		cp += idx;
+		/*
+		 * aligned
+		 */
+		if (((INT)cp & (sizeof(double)-1)) == 0) {
+		    ((double *)cp)[0] = __floatVal(flt);
+		    RETURN (aFloat);
+		}
+	    }
+	}
     }
 %}.
 
     1 to:8 do:[:srcIndex|
-        self at:index - 1 + srcIndex put:(flt basicAt:srcIndex)
+	self at:index - 1 + srcIndex put:(flt basicAt:srcIndex)
     ].
     ^ aFloat
 !
@@ -361,12 +361,12 @@
     |flt|
 
     msb == UninterpretedBytes isBigEndian ifTrue:[
-        ^ self doubleAt:index put:aFloat.
+	^ self doubleAt:index put:aFloat.
     ].
 
     flt := aFloat asFloat.
     1 to:8 do:[:srcIndex|
-        self at:index - 1 + srcIndex put:(flt basicAt:(9-srcIndex))
+	self at:index - 1 + srcIndex put:(flt basicAt:(9-srcIndex))
     ].
     ^ aFloat
 
@@ -391,33 +391,33 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index)) {
-        char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
 
-            if ((idx+(sizeof(float)-1)) < sz) {
-                cp += idx;
-                /*
-                 * aligned
-                 */
-                if (((INT)cp & (sizeof(float)-1)) == 0) {
-                    float fVal = ((float *)cp)[0];
+	    if ((idx+(sizeof(float)-1)) < sz) {
+		cp += idx;
+		/*
+		 * aligned
+		 */
+		if (((INT)cp & (sizeof(float)-1)) == 0) {
+		    float fVal = ((float *)cp)[0];
 		    OBJ f;
 
 		    __qMKSFLOAT(f, fVal);
-                    RETURN (f);
-                }
-            }
-        }
+		    RETURN (f);
+		}
+	    }
+	}
     }
 %}.
 
     newFloat := ShortFloat basicNew.
     1 to:4 do:[:destIndex|
-        newFloat basicAt:destIndex put:(self at:index - 1 + destIndex)
+	newFloat basicAt:destIndex put:(self at:index - 1 + destIndex)
     ].
     ^ newFloat.
 !
@@ -435,12 +435,12 @@
     |newFloat|
 
     msb == UninterpretedBytes isBigEndian ifTrue:[
-        ^ self floatAt:index
+	^ self floatAt:index
     ].
 
     newFloat := ShortFloat basicNew.
     1 to:4 do:[:destIndex|
-        newFloat basicAt:(5-destIndex) put:(self at:index - 1 + destIndex)
+	newFloat basicAt:(5-destIndex) put:(self at:index - 1 + destIndex)
     ].
     ^ newFloat.
 
@@ -465,30 +465,30 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index) && __isShortFloat(sflt)) {
-        char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
 
-            if ((idx+(sizeof(float)-1)) < sz) {
-                cp += idx;
-                /*
-                 * aligned
-                 */
-                if (((INT)cp & (sizeof(float)-1)) == 0) {
-                    ((float *)cp)[0] = __shortFloatVal(sflt);
+	    if ((idx+(sizeof(float)-1)) < sz) {
+		cp += idx;
+		/*
+		 * aligned
+		 */
+		if (((INT)cp & (sizeof(float)-1)) == 0) {
+		    ((float *)cp)[0] = __shortFloatVal(sflt);
 
-                    RETURN (aFloat);
-                }
-            }
-        }
+		    RETURN (aFloat);
+		}
+	    }
+	}
     }
 %}.
 
     1 to:4 do:[:srcIndex|
-        self at:index - 1 + srcIndex put:(sflt basicAt:srcIndex)
+	self at:index - 1 + srcIndex put:(sflt basicAt:srcIndex)
     ].
     ^ aFloat
 !
@@ -505,12 +505,12 @@
     |sflt|
 
     msb == UninterpretedBytes isBigEndian ifTrue:[
-        ^ self floatAt:index put:aFloat
+	^ self floatAt:index put:aFloat
     ].
 
     sflt := aFloat asShortFloat.
     1 to:4 do:[:srcIndex|
-        self at:index - 1 + srcIndex put:(sflt basicAt:(5-srcIndex))
+	self at:index - 1 + srcIndex put:(sflt basicAt:(5-srcIndex))
     ].
     ^ aFloat
 
@@ -610,7 +610,7 @@
 
     w := self unsignedLongLongAt:index bigEndian:(UninterpretedBytes isBigEndian).
     (w > (16r7FFFFFFFFFFFFFFF)) ifTrue:[
-        ^ w - (16r10000000000000000)
+	^ w - (16r10000000000000000)
     ].
     ^ w
 
@@ -636,7 +636,7 @@
 
     w := self unsignedLongLongAt:index bigEndian:msb.
     (w > (16r7FFFFFFFFFFFFFFF)) ifTrue:[
-        ^ w - (16r10000000000000000)
+	^ w - (16r10000000000000000)
     ].
     ^ w
 
@@ -672,7 +672,7 @@
 
     v := anInteger.
     anInteger < 0 ifTrue:[
-        v := v + 16r10000000000000000
+	v := v + 16r10000000000000000
     ].
     ^ self unsignedLongLongAt:byteIndex put:v bigEndian:msb
 
@@ -691,15 +691,15 @@
 
     l := LargeInteger basicNew numberOfDigits:8.
     msb ifTrue:[
-        bIdx := index + 7.
-        delta := -1
+	bIdx := index + 7.
+	delta := -1
     ] ifFalse:[
-        bIdx := index.
-        delta := 1
+	bIdx := index.
+	delta := 1
     ].
     1 to:8 do:[:i |
-        l digitAt:i put:(self basicAt:bIdx).
-        bIdx := bIdx + delta
+	l digitAt:i put:(self basicAt:bIdx).
+	bIdx := bIdx + delta
     ].
     ^ l compressed
 
@@ -758,15 +758,15 @@
 
     l := LargeInteger basicNew numberOfDigits:8.
     msb ifTrue:[
-        bIdx := index + 7.
-        delta := -1
+	bIdx := index + 7.
+	delta := -1
     ] ifFalse:[
-        bIdx := index.
-        delta := 1
+	bIdx := index.
+	delta := 1
     ].
     1 to:8 do:[:i |
-        l digitAt:i put:(self basicAt:bIdx).
-        bIdx := bIdx + delta
+	l digitAt:i put:(self basicAt:bIdx).
+	bIdx := bIdx + delta
     ].
     ^ l compressed
 
@@ -803,19 +803,19 @@
      delta "{ Class: SmallInteger }"|
 
     ((anInteger < 0) or:[anInteger > 16rFFFFFFFFFFFFFFFF]) ifTrue:[
-        ^ self elementBoundsError
+	^ self elementBoundsError
     ].
 
     msb ifTrue:[
-        bIdx := index + 7.
-        delta := -1
+	bIdx := index + 7.
+	delta := -1
     ] ifFalse:[
-        bIdx := index.
-        delta := 1
+	bIdx := index.
+	delta := 1
     ].
     1 to:8 do:[:i |
-        self basicAt:bIdx put:(anInteger digitAt:i).
-        bIdx := bIdx + delta.
+	self basicAt:bIdx put:(anInteger digitAt:i).
+	bIdx := bIdx + delta.
     ].
     ^ anInteger
 
@@ -844,46 +844,46 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index)) {
-        char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
-            int iVal;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	    int iVal;
 
-            if ((idx+(sizeof(int)-1)) < sz) {
-                cp += idx;
+	    if ((idx+(sizeof(int)-1)) < sz) {
+		cp += idx;
 
 #if defined(i386) || defined(UNALIGNED_FETCH_OK)
-                /* aligned or not - we dont care
-                 * (i386 can fetch unaligned)
-                 */
-                iVal = ((int *)cp)[0];
+		/* aligned or not - we dont care
+		 * (i386 can fetch unaligned)
+		 */
+		iVal = ((int *)cp)[0];
 #else
-                if (((INT)cp & (sizeof(int)-1)) == 0) {
-                    /*
-                     * aligned
-                     */
-                    iVal = ((int *)cp)[0];
-                } else {
-                    union {
-                        char c[4];
-                        int  i;
-                    } u;
-                    u.c[0] = cp[0];
-                    u.c[1] = cp[1];
-                    u.c[2] = cp[2];
-                    u.c[3] = cp[3];
-                    iVal = u.i;
-                }
+		if (((INT)cp & (sizeof(int)-1)) == 0) {
+		    /*
+		     * aligned
+		     */
+		    iVal = ((int *)cp)[0];
+		} else {
+		    union {
+			char c[4];
+			int  i;
+		    } u;
+		    u.c[0] = cp[0];
+		    u.c[1] = cp[1];
+		    u.c[2] = cp[2];
+		    u.c[3] = cp[3];
+		    iVal = u.i;
+		}
 #endif
-                if ((iVal >= 0) && (iVal <= _MAX_INT)) {
-                    RETURN ( __MKSMALLINT(iVal) );
-                }
-                RETURN ( __MKULARGEINT(iVal) );
-            }
-        }
+		if ((iVal >= 0) && (iVal <= _MAX_INT)) {
+		    RETURN ( __MKSMALLINT(iVal) );
+		}
+		RETURN ( __MKULARGEINT(iVal) );
+	    }
+	}
     }
 %}.
 
@@ -920,59 +920,59 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index)) {
-        unsigned char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
-            int iVal;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	    int iVal;
 
-            if ((idx+(sizeof(int)-1)) < sz) {
-                cp += idx;
+	    if ((idx+(sizeof(int)-1)) < sz) {
+		cp += idx;
 
-                if (msb == true) {
+		if (msb == true) {
 #if defined(__MSBFIRST) || defined(sparc)
-                    if (((INT)cp & (sizeof(int)-1))== 0) {
-                        /*
-                         * aligned
-                         */
-                        iVal = ((int *)cp)[0];
-                    } else
+		    if (((INT)cp & (sizeof(int)-1))== 0) {
+			/*
+			 * aligned
+			 */
+			iVal = ((int *)cp)[0];
+		    } else
 #endif
-                    {
-                        iVal = cp[0];
-                        iVal = (iVal << 8) | cp[1];
-                        iVal = (iVal << 8) | cp[2];
-                        iVal = (iVal << 8) | cp[3];
-                    }
-                } else {
-#ifdef i386
-                    /*
-                     * aligned or not - we dont care
-                     * (i386 can fetch unaligned)
-                     */
-                    iVal = ((int *)cp)[0];
+		    {
+			iVal = cp[0];
+			iVal = (iVal << 8) | cp[1];
+			iVal = (iVal << 8) | cp[2];
+			iVal = (iVal << 8) | cp[3];
+		    }
+		} else {
+#if defined(i386) || (defined(UNALIGNED_FETCH_OK) && defined(__LSBFIRST))
+		    /*
+		     * aligned or not - we dont care
+		     * (i386 can fetch unaligned)
+		     */
+		    iVal = ((int *)cp)[0];
 #else
-# if defined(__LSBFIRST)
-                    if (((INT)cp & (sizeof(int)-1))== 0) {
-                        /*
-                         * aligned
-                         */
-                        iVal = ((int *)cp)[0];
-                    } else
+# if defined(__LSBFIRST) || defined(i386)
+		    if (((INT)cp & (sizeof(int)-1))== 0) {
+			/*
+			 * aligned
+			 */
+			iVal = ((int *)cp)[0];
+		    } else
 # endif
-                    {
-                        iVal = cp[3];
-                        iVal = (iVal << 8) | cp[2];
-                        iVal = (iVal << 8) | cp[1];
-                        iVal = (iVal << 8) | cp[0];
-                    }
+		    {
+			iVal = cp[3];
+			iVal = (iVal << 8) | cp[2];
+			iVal = (iVal << 8) | cp[1];
+			iVal = (iVal << 8) | cp[0];
+		    }
 #endif
-                }
-                RETURN (__MKUINT(iVal));
-            }
-        }
+		}
+		RETURN (__MKUINT(iVal));
+	    }
+	}
     }
 %}.
 
@@ -986,8 +986,8 @@
     b4 := self at:(i+3).
 
     msb ifFalse:[
-        t := b4. b4 := b1. b1 := t.
-        t := b3. b3 := b2. b2 := t.
+	t := b4. b4 := b1. b1 := t.
+	t := b3. b3 := b2. b2 := t.
     ].
     ival := b1.
     ival := (ival bitShift:8) + b2.
@@ -1035,20 +1035,20 @@
     |i "{ Class: SmallInteger }" |
 
     ((aNumber < 0) or:[aNumber > 16rFFFFFFFF]) ifTrue:[
-        ^ self elementBoundsError
+	^ self elementBoundsError
     ].
 
     i := index.
     msb ifTrue:[
-        self at:i     put:(aNumber digitAt:4).
-        self at:(i+1) put:(aNumber digitAt:3).
-        self at:(i+2) put:(aNumber digitAt:2).
-        self at:(i+3) put:(aNumber digitAt:1).
+	self at:i     put:(aNumber digitAt:4).
+	self at:(i+1) put:(aNumber digitAt:3).
+	self at:(i+2) put:(aNumber digitAt:2).
+	self at:(i+3) put:(aNumber digitAt:1).
     ] ifFalse:[
-        self at:i     put:(aNumber digitAt:1).
-        self at:(i+1) put:(aNumber digitAt:2).
-        self at:(i+2) put:(aNumber digitAt:3).
-        self at:(i+3) put:(aNumber digitAt:4).
+	self at:i     put:(aNumber digitAt:1).
+	self at:(i+1) put:(aNumber digitAt:2).
+	self at:(i+2) put:(aNumber digitAt:3).
+	self at:(i+3) put:(aNumber digitAt:4).
     ].
     ^ aNumber
 
@@ -1117,8 +1117,12 @@
 longAt:index
     "return the 4-bytes starting at index as a signed Integer.
      The index is a smalltalk index (i.e. 1-based).
-     The value is retrieved in the machines natural byte order.
-     This may be worth a primitive."
+     The value is retrieved in the machines natural byte order,
+     therefore, this should only be used for byte-data which is
+     only used inside this machine.
+     To setup data packets which are to be sent to other machines,
+     or stored into a file, always use longAt:MSB: and specify
+     a definite byteOrder."
 
     |w|
 
@@ -1127,31 +1131,42 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index)) {
-        char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
 
-            if ((idx+(sizeof(int)-1)) < sz) {
-                cp += idx;
-                /*
-                 * aligned
-                 */
-                if (((INT)cp & (sizeof(int)-1)) == 0) {
-                    INT iVal = ((int *)cp)[0];
+	    if ((idx+(sizeof(int)-1)) < sz) {
+		cp += idx;
+#if defined(i386)
+		/*
+		 * aligned or not, we dont care (i386 can do both)
+		 */
+		{
+		    int iVal = ((int *)cp)[0];
 
-                    RETURN (__MKINT(iVal));
-                }
-            }
-        }
+		    RETURN (__MKINT(iVal));
+		}
+#else
+		/*
+		 * aligned
+		 */
+		if (((INT)cp & (sizeof(int)-1)) == 0) {
+		    INT iVal = ((int *)cp)[0];
+
+		    RETURN (__MKINT(iVal));
+		}
+#endif
+	    }
+	}
     }
 %}.
 
     w := self unsignedLongAt:index.
     (w > (16r7FFFFFFF)) ifTrue:[
-        ^ w - (16r100000000)
+	^ w - (16r100000000)
     ].
     ^ w
 
@@ -1176,7 +1191,7 @@
 
     w := self unsignedLongAt:index bigEndian:msb.
     (w > (16r7FFFFFFF)) ifTrue:[
-        ^ w - (16r100000000)
+	^ w - (16r100000000)
     ].
     ^ w
 
@@ -1206,39 +1221,39 @@
      * handle the most common cases fast ...
      */
     if (__isSmallInteger(index)) {
-        char *cp;
-        int sz;
+	unsigned char *cp;
+	int sz;
 
-        __fetchBytePointerAndSize__(self, &cp, &sz);
-        if (cp) {
-            unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
+	__fetchBytePointerAndSize__(self, &cp, &sz);
+	if (cp) {
+	    unsigned INT idx = ((unsigned INT)__intVal(index)) - 1;
 
-            if ((idx+(sizeof(int)-1)) < sz) {
-                cp += idx;
-                /*
-                 * aligned
-                 */
-                if (((INT)cp & (sizeof(int)-1)) == 0) {
+	    if ((idx+(sizeof(int)-1)) < sz) {
+		cp += idx;
+		/*
+		 * aligned
+		 */
+		if (((INT)cp & (sizeof(int)-1)) == 0) {
 		    int __v;
 
-    		    if (__isSmallInteger(value)) {
-                        ((int *)cp)[0] = __intVal(value);
-                        RETURN (value);
+		    if (__isSmallInteger(value)) {
+			((int *)cp)[0] = __intVal(value);
+			RETURN (value);
 		    }
 		    if (__v = __signedLongIntVal(value)) {
 			((int *)cp)[0] = __v;
 			RETURN (value);
 		    }
-                }
-            }
-        }
+		}
+	    }
+	}
     }
 %}.
 
     value >= 0 ifTrue:[
-        v := value
+	v := value
     ] ifFalse:[
-        v := value + 16r100000000
+	v := value + 16r100000000
     ].
     self unsignedLongAt:index put:v.
     ^ value
@@ -1263,7 +1278,7 @@
 
     v := anInteger.
     anInteger < 0 ifTrue:[
-        v := v + 16r100000000
+	v := v + 16r100000000
     ].
     ^ self unsignedLongAt:byteIndex put:v bigEndian:msb
 
@@ -1512,9 +1527,9 @@
     |v|
 
     value >= 0 ifTrue:[
-        v := value
+	v := value
     ] ifFalse:[
-        v := 16r10000 + value
+	v := 16r10000 + value
     ].
     self unsignedShortAt:index put:v.
     ^ value
@@ -1582,9 +1597,9 @@
     |v|
 
     value >= 0 ifTrue:[
-        v := value
+	v := value
     ] ifFalse:[
-        v := 16r10000 + value
+	v := 16r10000 + value
     ].
     self unsignedShortAt:index put:v.
     ^ value
@@ -1657,7 +1672,7 @@
     b1 := self at:index.
     b2 := self at:(index + 1).
     msb ifTrue:[
-        ^ (b1 bitShift:8) + b2
+	^ (b1 bitShift:8) + b2
     ].
     ^ (b2 bitShift:8) + b1
 
@@ -1697,14 +1712,14 @@
 
     iVal := value.
     ((iVal < 0) or:[iVal > 16rFFFF]) ifTrue:[
-        ^ self elementBoundsError
+	^ self elementBoundsError
     ].
     msb ifTrue:[
-        b1 := ((iVal bitShift:-8) bitAnd:16rFF).
-        b2 := (iVal bitAnd:16rFF).
+	b1 := ((iVal bitShift:-8) bitAnd:16rFF).
+	b2 := (iVal bitAnd:16rFF).
     ] ifFalse:[
-        b1 := (iVal bitAnd:16rFF).
-        b2 := ((iVal bitShift:-8) bitAnd:16rFF).
+	b1 := (iVal bitAnd:16rFF).
+	b2 := ((iVal bitShift:-8) bitAnd:16rFF).
     ].
     self at:index   put:b1.
     self at:index+1 put:b2.
@@ -1748,7 +1763,7 @@
     b1 := self at:index.
     b2 := self at:(index + 1).
     msb ifTrue:[
-        ^ (b1 bitShift:8) + b2
+	^ (b1 bitShift:8) + b2
     ].
     ^ (b2 bitShift:8) + b1
 
@@ -1788,14 +1803,14 @@
 
     iVal := value.
     ((iVal < 0) or:[iVal > 16rFFFF]) ifTrue:[
-        ^ self elementBoundsError
+	^ self elementBoundsError
     ].
     msb ifTrue:[
-        b1 := ((iVal bitShift:-8) bitAnd:16rFF).
-        b2 := (iVal bitAnd:16rFF).
+	b1 := ((iVal bitShift:-8) bitAnd:16rFF).
+	b2 := (iVal bitAnd:16rFF).
     ] ifFalse:[
-        b1 := (iVal bitAnd:16rFF).
-        b2 := ((iVal bitShift:-8) bitAnd:16rFF).
+	b1 := (iVal bitAnd:16rFF).
+	b2 := ((iVal bitShift:-8) bitAnd:16rFF).
     ].
     self at:index   put:b1.
     self at:index+1 put:b2.
@@ -1874,8 +1889,8 @@
     stream := WriteStream on:''.
     i := index.
     [(c := self basicAt:i) ~~ 0] whileTrue:[
-        stream nextPut:(Character value:c).
-        i := i + 1.
+	stream nextPut:(Character value:c).
+	i := i + 1.
     ].
     ^ stream contents
 
@@ -1891,8 +1906,8 @@
 
     i := index.
     aString do:[:aChar |
-        self basicAt:i put:aChar asciiValue.
-        i := i + 1.
+	self basicAt:i put:aChar asciiValue.
+	i := i + 1.
     ].
     self basicAt:i put:0.
     ^ aString
@@ -1903,7 +1918,7 @@
      bytes := ExternalBytes new:10.
      bytes stringAt:1 put:'hello'.
      1 to:bytes size do:[:i |
-        Transcript showCR:(bytes at:i)
+	Transcript showCR:(bytes at:i)
      ]
     "
 
@@ -1920,8 +1935,8 @@
     i := index.
     [(i <= maxSize)
      and:[(c := self basicAt:i) ~~ 0]] whileTrue:[
-        stream nextPut:(Character value:c).
-        i := i + 1.
+	stream nextPut:(Character value:c).
+	i := i + 1.
     ].
     ^ stream contents
 
@@ -1975,5 +1990,5 @@
 !UninterpretedBytes class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/UninterpretedBytes.st,v 1.33 1999-06-05 10:40:28 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/UninterpretedBytes.st,v 1.34 1999-06-24 07:36:27 cg Exp $'
 ! !