Add `ByteArray >> #pythonOn:` and `#pythonString` utility methods jv
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 07 Feb 2019 10:38:17 +0000
branchjv
changeset 23755 76c13487ed08
parent 23754 41e4acf3b3f6
child 23756 2582a63e84ef
Add `ByteArray >> #pythonOn:` and `#pythonString` utility methods ...that prints (answers) a ciresponding python string literal. Useful when copy-pasting byte arrays to Python code.
ByteArray.st
--- a/ByteArray.st	Sat Jan 19 21:24:42 2019 +0000
+++ b/ByteArray.st	Thu Feb 07 10:38:17 2019 +0000
@@ -166,6 +166,9 @@
 ! !
 
 
+
+
+
 !ByteArray class methodsFor:'queries'!
 
 elementByteSize
@@ -200,6 +203,7 @@
     ^ 0
 ! !
 
+
 !ByteArray methodsFor:'Compatibility-Squeak'!
 
 bitXor:aByteArray
@@ -225,6 +229,7 @@
     "
 ! !
 
+
 !ByteArray methodsFor:'accessing'!
 
 basicAt:index
@@ -234,10 +239,10 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER INT indx;
+    REGISTER int indx;
     REGISTER OBJ slf;
     REGISTER OBJ cls;
-    REGISTER INT nIndex;
+    REGISTER int nIndex;
 
     if (__isSmallInteger(index)) {
 	indx = __intVal(index) - 1;
@@ -251,7 +256,7 @@
 	    indx += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
 	}
 	nIndex = __byteArraySize(slf);
-	if ((unsigned INT)indx < (unsigned INT)nIndex) {
+	if ((unsigned)indx < (unsigned)nIndex) {
 	    RETURN ( __mkSmallInteger((__ByteArrayInstPtr(slf)->ba_element[indx])) );
 	}
     }
@@ -268,8 +273,8 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER INT indx;
-    unsigned INT nIndex;
+    REGISTER int indx;
+    int nIndex;
     int val;
     REGISTER OBJ slf;
     REGISTER OBJ cls;
@@ -288,7 +293,7 @@
 		indx += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
 	    }
 	    nIndex = __byteArraySize(slf);
-	    if ((unsigned INT)indx < (unsigned INT)nIndex) {
+	    if ((unsigned)indx < (unsigned)nIndex) {
 		__ByteArrayInstPtr(slf)->ba_element[indx] = val;
 		RETURN ( value );
 	    }
@@ -308,9 +313,9 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER INT indx;
+    REGISTER int indx;
     REGISTER int byte;
-    unsigned INT nIndex;
+    int nIndex;
     REGISTER OBJ slf;
     REGISTER OBJ cls;
 
@@ -326,7 +331,7 @@
 	    byte += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
 	}
 	nIndex = __byteArraySize(slf);
-	if ((unsigned)byte < (unsigned INT)nIndex) {
+	if ((unsigned)byte < (unsigned)nIndex) {
 	    RETURN ( __mkSmallInteger(((__ByteArrayInstPtr(slf)->ba_element[byte] & (1 << indx)) != 0)) );
 	}
     }
@@ -351,9 +356,9 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER INT indx;
+    REGISTER int indx;
     REGISTER int byte;
-    unsigned INT nIndex;
+    int nIndex;
     REGISTER OBJ slf;
     REGISTER OBJ cls;
 
@@ -369,7 +374,7 @@
 	    byte += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
 	}
 	nIndex = __byteArraySize(slf);
-	if ((unsigned)byte < (unsigned INT)nIndex) {
+	if ((unsigned)byte < (unsigned)nIndex) {
 	    __ByteArrayInstPtr(slf)->ba_element[byte] &= ~(1 << indx);
 	    RETURN (slf);
 	}
@@ -416,13 +421,13 @@
         if (indx >= 0) {
             int byteIndex;
             int bitIndex;
-            unsigned INT nIndex;
+            int nIndex;
 
             byteIndex = indx / 8;
             bitIndex = indx % 8;
 
             nIndex = __byteArraySize(self);
-            if ((unsigned)byteIndex < (unsigned INT)nIndex) {
+            if ((unsigned)byteIndex < (unsigned)nIndex) {
                 __ByteArrayInstPtr(self)->ba_element[byteIndex] |= (1 << bitIndex);
                 RETURN (self);
             }
@@ -464,8 +469,8 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER INT indx;
-    unsigned INT nIndex;
+    REGISTER int indx;
+    int nIndex;
     REGISTER OBJ slf;
     REGISTER OBJ cls;
 
@@ -477,7 +482,7 @@
 	    indx += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
 	}
 	nIndex = __byteArraySize(slf);
-	if ((unsigned INT)indx < (unsigned INT)nIndex) {
+	if ((unsigned)indx < (unsigned)nIndex) {
 	    RETURN ( __mkSmallInteger((__ByteArrayInstPtr(slf)->ba_element[indx])) );
 	}
     }
@@ -492,8 +497,8 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER INT indx;
-    unsigned INT nIndex;
+    REGISTER int indx;
+    int nIndex;
     int val;
     REGISTER OBJ slf;
     REGISTER OBJ cls;
@@ -509,7 +514,7 @@
                 indx += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
             }
             nIndex = __byteArraySize(slf);
-            if ((unsigned INT)indx < (unsigned INT)nIndex) {
+            if ((unsigned)indx < (unsigned)nIndex) {
                 __ByteArrayInstPtr(slf)->ba_element[indx] = val;
                 RETURN ( value );
             }
@@ -534,7 +539,7 @@
 %{  /* NOCONTEXT */
 
     REGISTER INT indx;
-    unsigned INT nIndex;
+    int nIndex;
     union {
         unsigned char u_char[4];
         unsigned int u_uint;
@@ -598,7 +603,7 @@
 %{  /* NOCONTEXT */
 
     REGISTER INT indx;
-    unsigned INT nIndex;
+    int nIndex;
     int val;
     OBJ cls;
     unsigned char *byteP;
@@ -690,7 +695,7 @@
 %{  /* NOCONTEXT */
 
     REGISTER INT indx;
-    unsigned INT nIndex;
+    int nIndex;
     union {
         unsigned char u_char[2];
         unsigned short u_ushort;
@@ -730,7 +735,7 @@
 
 %{  /* NOCONTEXT */
     REGISTER INT indx;
-    unsigned INT nIndex;
+    int nIndex;
     int val;
     unsigned char *byteP;
 
@@ -807,7 +812,7 @@
 %{  /* NOCONTEXT */
 
     REGISTER INT indx;
-    unsigned INT nIndex;
+    int nIndex;
     int v;
     union {
         unsigned char u_char[2];
@@ -876,7 +881,7 @@
 %{  /* NOCONTEXT */
 
     REGISTER INT indx;
-    unsigned INT nIndex;
+    int nIndex;
     int val;
     OBJ cls;
     unsigned char *byteP;
@@ -2780,6 +2785,46 @@
     "Created: / 31.10.2001 / 09:43:41 / cg"
 !
 
+pythonOn: aStream
+    "Prints receiver as Python string literal on `aStream`.
+
+     This may be useful when copy-pasting ByteArray values to
+     Python code."
+
+    aStream nextPut:$'.  
+    self do:[:byte | 
+        (byte between: $0 codePoint and: $z codePoint) ifTrue:[
+            aStream nextPut: (Character codePoint: byte)  
+        ] ifFalse:[ 
+            aStream nextPutAll: '\x'.
+            byte printOn:aStream base:16 size:2 fill:$0
+        ].
+    ].
+    aStream nextPut:$'.
+
+    "
+    #[46 0 1 1 0 41 0 1 1 0 36 0 0 0 0 0 1 0 28 0 1 25 0 97 83 101 113 117 101 110 99 101 97 98 108 101 67 111 108 108 101 99 116 105 111 110] pythonString
+    "
+
+    "Created: / 22-06-2018 / 09:30:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 07-02-2019 / 10:32:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+pythonString
+    "Returns Python-escaped representation of self as String`.
+
+     This may be useful when copu-pasting ByteArray values to
+     Python code."
+
+    ^ String streamContents:[ :s | self pythonOn: s ]
+
+    "
+    #[46 0 1 1 0 41 0 1 1 0 36 0 0 0 0 0 1 0 28 0 1 25 0 97 83 101 113 117 101 110 99 101 97 98 108 101 67 111 108 108 101 99 116 105 111 110] pythonString
+    "
+
+    "Created: / 22-06-2018 / 09:31:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 storeOn:aStream
     "append a printed representation from which the receiver can be
      reconstructed to aStream. (reimplemented to make it look better)"
@@ -3217,6 +3262,7 @@
     "Modified: 22.4.1996 / 12:55:30 / cg"
 ! !
 
+
 !ByteArray class methodsFor:'documentation'!
 
 version
@@ -3225,5 +3271,10 @@
 
 version_CVS
     ^ '$Header$'
+!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
 ! !