summaryrefslogtreecommitdiff
path: root/modules/language/python/bytes.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/bytes.scm')
-rw-r--r--modules/language/python/bytes.scm30
1 files changed, 28 insertions, 2 deletions
diff --git a/modules/language/python/bytes.scm b/modules/language/python/bytes.scm
index 8cca953..ceaa5b6 100644
--- a/modules/language/python/bytes.scm
+++ b/modules/language/python/bytes.scm
@@ -15,7 +15,7 @@
#:use-module (language python bool)
#:use-module (language python persist)
#:export (<py-bytes> bv-scm pybytes-listing bytes bytearray bytes->bytevector
- py-decode
+ py-decode make_trans
<py-bytearray> pybytesarray-listing scm-bytevector))
(define (bv-scm x)
@@ -89,6 +89,9 @@
x)))
(define-python-class bytes (<py-bytes>)
+ (define maketrans
+ (lambda (x y) (make_trans x y)))
+
(define __init__
(case-lambda
((self)
@@ -1143,7 +1146,30 @@
(+ i 1)))
(lp (+ i 1) r old)))
(reverse r)))))
-
+
+(define (make_trans b1 b2)
+ (let* ((b1 (bv-scm b1))
+ (b2 (bv-scm b2))
+ (n1 (len b1))
+ (n2 (len b2))
+ (n (let lp ((i 0) (r 0))
+ (if (< i n1)
+ (lp (+ i 1) (max (bytevector-u8-ref b1 i) r))
+ r))))
+ (if (= n1 n2)
+ (let lp ((i 0) (r '()))
+ (if (< i n)
+ (let lp2 ((j 0))
+ (if (< j n1)
+ (if (= (bytevector-u8-ref b1 j) i)
+ (lp (+ i 1) (cons (bytevector-u8-ref b2 j) r))
+ (lp2 (+ j 1)))
+ (lp (+ i 1) (cons i r))))
+ (bytes (list->u8vector (reverse r)))))
+ (raise
+ (ValueError
+ "maketrans: wrong number in second string compared to first")))))
+
(define-py* translate (py-translate bytes s n table . l)
(let* ((table (b-get table))
(w (b-make n))