js-on-sx: decodeURI/decodeURIComponent + harness decimalToHexString
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 45s

This commit is contained in:
2026-05-08 19:02:44 +00:00
parent 0d99b5dfe8
commit 5b501f7937
3 changed files with 160 additions and 2 deletions

View File

@@ -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

View File

@@ -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)
"""