js-on-sx: decodeURI/decodeURIComponent + harness decimalToHexString
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 45s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 45s
This commit is contained in:
@@ -4201,11 +4201,157 @@
|
||||
(v)
|
||||
(let ((s (js-to-string v))) (js-uri-encode-loop s 0 ""))))
|
||||
|
||||
(define decodeURIComponent (fn (v) (js-to-string v)))
|
||||
(define
|
||||
decodeURIComponent
|
||||
(fn (v) (let ((s (js-to-string v))) (js-uri-decode s 0 "" false))))
|
||||
|
||||
(define encodeURI (fn (v) (js-to-string v)))
|
||||
|
||||
(define decodeURI (fn (v) (js-to-string v)))
|
||||
(define
|
||||
decodeURI
|
||||
(fn (v) (let ((s (js-to-string v))) (js-uri-decode s 0 "" true))))
|
||||
|
||||
(define
|
||||
js-uri-malformed!
|
||||
(fn () (raise (js-new-call URIError (js-args "URI malformed")))))
|
||||
|
||||
(define
|
||||
js-uri-reserved-byte?
|
||||
(fn
|
||||
(b)
|
||||
(or
|
||||
(= b 35)
|
||||
(= b 36)
|
||||
(= b 38)
|
||||
(= b 43)
|
||||
(= b 44)
|
||||
(= b 47)
|
||||
(= b 58)
|
||||
(= b 59)
|
||||
(= b 61)
|
||||
(= b 63)
|
||||
(= b 64))))
|
||||
|
||||
(define
|
||||
js-uri-hex-val
|
||||
(fn
|
||||
(c)
|
||||
(let
|
||||
((cc (char-code c)))
|
||||
(cond
|
||||
((and (>= cc 48) (<= cc 57)) (- cc 48))
|
||||
((and (>= cc 65) (<= cc 70)) (- cc 55))
|
||||
((and (>= cc 97) (<= cc 102)) (- cc 87))
|
||||
(else -1)))))
|
||||
|
||||
(define
|
||||
js-uri-hex-pair
|
||||
(fn
|
||||
(s i)
|
||||
(cond
|
||||
((>= (+ i 1) (len s)) -1)
|
||||
(else
|
||||
(let
|
||||
((d1 (js-uri-hex-val (char-at s i)))
|
||||
(d2 (js-uri-hex-val (char-at s (+ i 1)))))
|
||||
(cond
|
||||
((or (= d1 -1) (= d2 -1)) -1)
|
||||
(else (+ (* d1 16) d2))))))))
|
||||
|
||||
(define
|
||||
js-uri-decode
|
||||
(fn
|
||||
(s i acc preserveReserved)
|
||||
(cond
|
||||
((>= i (len s)) acc)
|
||||
((not (= (char-at s i) "%"))
|
||||
(js-uri-decode
|
||||
s
|
||||
(+ i 1)
|
||||
(str acc (char-at s i))
|
||||
preserveReserved))
|
||||
((> (+ i 3) (len s)) (js-uri-malformed!))
|
||||
(else
|
||||
(let
|
||||
((b (js-uri-hex-pair s (+ i 1))))
|
||||
(cond
|
||||
((= b -1) (js-uri-malformed!))
|
||||
((< b 128)
|
||||
(cond
|
||||
((and preserveReserved (js-uri-reserved-byte? b))
|
||||
(js-uri-decode
|
||||
s
|
||||
(+ i 3)
|
||||
(str acc (char-at s i) (char-at s (+ i 1)) (char-at s (+ i 2)))
|
||||
preserveReserved))
|
||||
(else
|
||||
(js-uri-decode
|
||||
s
|
||||
(+ i 3)
|
||||
(str acc (char-from-code b))
|
||||
preserveReserved))))
|
||||
(else (js-uri-decode-multi s i acc preserveReserved b))))))))
|
||||
|
||||
(define
|
||||
js-uri-decode-multi
|
||||
(fn
|
||||
(s i acc preserveReserved b1)
|
||||
(let
|
||||
((n
|
||||
(cond
|
||||
((< b1 192) -1)
|
||||
((< b1 224) 2)
|
||||
((< b1 240) 3)
|
||||
((< b1 248) 4)
|
||||
(else -1)))
|
||||
(head-bits
|
||||
(cond
|
||||
((< b1 192) 0)
|
||||
((< b1 224) (mod b1 32))
|
||||
((< b1 240) (mod b1 16))
|
||||
((< b1 248) (mod b1 8))
|
||||
(else 0))))
|
||||
(cond
|
||||
((= n -1) (js-uri-malformed!))
|
||||
(else
|
||||
(js-uri-decode-multi-loop s i acc preserveReserved n 1 head-bits))))))
|
||||
|
||||
(define
|
||||
js-uri-decode-multi-loop
|
||||
(fn
|
||||
(s i acc preserveReserved n k cp)
|
||||
(cond
|
||||
((>= k n)
|
||||
(cond
|
||||
((and (>= cp 55296) (<= cp 57343)) (js-uri-malformed!))
|
||||
((> cp 1114111) (js-uri-malformed!))
|
||||
(else
|
||||
(js-uri-decode
|
||||
s
|
||||
(+ i (* 3 n))
|
||||
(str acc (char-from-code cp))
|
||||
preserveReserved))))
|
||||
(else
|
||||
(let
|
||||
((p (+ i (* 3 k))))
|
||||
(cond
|
||||
((>= (+ p 3) (+ (len s) 1)) (js-uri-malformed!))
|
||||
((not (= (char-at s p) "%")) (js-uri-malformed!))
|
||||
(else
|
||||
(let
|
||||
((b (js-uri-hex-pair s (+ p 1))))
|
||||
(cond
|
||||
((= b -1) (js-uri-malformed!))
|
||||
((or (< b 128) (>= b 192)) (js-uri-malformed!))
|
||||
(else
|
||||
(js-uri-decode-multi-loop
|
||||
s
|
||||
i
|
||||
acc
|
||||
preserveReserved
|
||||
n
|
||||
(+ k 1)
|
||||
(+ (* cp 64) (mod b 64)))))))))))))
|
||||
|
||||
(define
|
||||
js-uri-encode-loop
|
||||
|
||||
@@ -146,6 +146,16 @@ var isConstructor = function (f) {
|
||||
// Best-effort: built-in functions and arrows aren't; declared `function` decls are.
|
||||
return false;
|
||||
};
|
||||
// decimalToHexString.js include — used by URI/escape tests.
|
||||
var decimalToHexString = function (n) {
|
||||
var hex = "0123456789ABCDEF";
|
||||
if (n < 0) { n = n + 65536; }
|
||||
return hex[(n >> 12) & 15] + hex[(n >> 8) & 15] + hex[(n >> 4) & 15] + hex[n & 15];
|
||||
};
|
||||
var decimalToPercentHexString = function (n) {
|
||||
var hex = "0123456789ABCDEF";
|
||||
return "%" + hex[(n >> 4) & 15] + hex[n & 15];
|
||||
};
|
||||
// Trivial helper for tests that use Array.isArray-like functionality
|
||||
// (many tests reach for it via compareArray)
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user