diff options
Diffstat (limited to 'modules/language/python/bytes.scm')
-rw-r--r-- | modules/language/python/bytes.scm | 30 |
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)) |