- (fixnum p-old p-new old-len new-len))
- (let ((c (schar s p-old)))
- (when (char= c #\+)
- (setq c #\space))
- (case c
- (#\%
- (unless (>= old-len (+ p-old 3))
- (error "#\% not followed by enough characters"))
- (setf (schar new p-new)
- (code-char
- (parse-integer (subseq s (1+ p-old) (+ p-old 3))
- :radix 16)))
- (incf p-old 3))
- (t
- (setf (schar new p-new) c)
- (incf p-old))))))
+ (fixnum p-old p-new old-len new-len))
+ (let ((c (schar s p-old)))
+ (when (char= c #\+)
+ (setq c #\space))
+ (case c
+ (#\%
+ (unless (>= old-len (+ p-old 3))
+ (error "#\% not followed by enough characters"))
+ (setf (schar new p-new)
+ (code-char
+ (parse-integer (subseq s (1+ p-old) (+ p-old 3))
+ :radix 16)))
+ (incf p-old 3))
+ (t
+ (setf (schar new p-new) c)
+ (incf p-old))))))
+
+(defun split-uri-query-string (s)
+ (mapcar
+ (lambda (pair)
+ (let ((pos (position #\= pair)))
+ (when pos
+ (cons (subseq pair 0 pos)
+ (when (> (length pair) pos)
+ (decode-uri-query-string (subseq pair (1+ pos))))))))
+ (delimited-string-to-list s #\&)))