diff --git a/scheme/lib/uri.scm b/scheme/lib/uri.scm index 1b38f8a..bc796d1 100644 --- a/scheme/lib/uri.scm +++ b/scheme/lib/uri.scm @@ -62,19 +62,20 @@ (lp (+ i 1) hits)) hits)))) - (if (and (zero? hits) (zero? start) (= end (string-length s))) s + (if (and (zero? hits) (zero? start) (= end (string-length s))) + s + (let* ((nlen (- (- end start) (* hits 2))) ; the new length + ; of the + ; unescaped + ; string stores + ; the result + (ns (make-string nlen))) - (let* ((nlen (- (- end start) (* hits 2))) ; the new - ; length of the - ; unescaped - ; string - (ns (make-string nlen))) ; stores the result - - (let lp ((i start) (j 0)) ; sweap over the string + (let lp ((i start) (j 0)) ; sweep over the string (if (< j nlen) (lp (cond - ((esc-seq? i) ; unescape - ; escape-sequence + ((esc-seq? i) ; unescape + ; escape-sequence (string-set! ns j (let ((d1 (string-ref s (+ i 1))) (d2 (string-ref s (+ i 2)))) @@ -127,10 +128,12 @@ (lambda (c i) (+ i (if (char-set-contains? escaped-chars c) - 3 1))) + 3 + 1))) 0 s))) ; new length of escaped string - (if (= nlen (string-length s)) s + (if (= nlen (string-length s)) + s (let ((ns (make-string nlen))) (string-fold (lambda (c i) ; replace each occurance of an @@ -175,22 +178,21 @@ (string-join plist "/")) ; Insert slashes between elts of PLIST. (define (simplify-uri-path p) - (if (null? p) #f ; P must be non-null + (if (null? p) + #f ; P must be non-null (let lp ((path-list (cdr p)) (stack (list (car p)))) - (if (null? path-list) ; we're done - (reverse stack) - (cond - ((string=? (car path-list) "..") ; back up - ; neither the empty path nor root - (if (not (or (null? stack) (string=? (car stack) ""))) - (lp (cdr path-list) (cdr stack)) - #f)) - ((string=? (car path-list) ".") ; leave this - (lp (cdr path-list) stack)) - ((string=? (car path-list) "") ; back to root - (lp (cdr path-list) '(""))) - (else ; usual segment - (lp (cdr path-list) (cons (car path-list) stack)))))))) - - \ No newline at end of file + (if (null? path-list) ; we're done + (reverse stack) + (cond + ((string=? (car path-list) "..") ; back up + ; neither the empty path nor root + (if (not (or (null? stack) (string=? (car stack) ""))) + (lp (cdr path-list) (cdr stack)) + #f)) + ((string=? (car path-list) ".") ; leave this + (lp (cdr path-list) stack)) + ((string=? (car path-list) "") ; back to root + (lp (cdr path-list) '(""))) + (else ; usual segment + (lp (cdr path-list) (cons (car path-list) stack))))))))