X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=web-utils.lisp;h=56afffdd2d3bdc055f2c5221e2a1e215cc5c71e6;hp=1c475a8379a650c62fb0f259276f7e4ac9a2855d;hb=72b483ebb9fd0f02acb1b20ef14ee8bac845eca8;hpb=a287b1a6782d53c22fc1807e44aae62fb7094bc5 diff --git a/web-utils.lisp b/web-utils.lisp index 1c475a8..56afffd 100644 --- a/web-utils.lisp +++ b/web-utils.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: web-utils.lisp,v 1.11 2003/06/12 02:38:39 kevin Exp $ +;;;; $Id: web-utils.lisp,v 1.12 2003/06/12 11:10:38 kevin Exp $ ;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -22,7 +22,7 @@ ;;; HTML/XML constants (defvar *standard-xml-header* - #.(format nil "~%~%~%")) + #.(format nil "~%")) (defvar *standard-html-header* "") @@ -82,3 +82,31 @@ amp (car var) "=" (cadr var)))) (rest vars)))) "")))) + +(defun decode-uri-query-string (s) + "Decode a URI query string field" + (declare (simple-string s) + (optimize (speed 3) (safety 0) (space 0))) + (do* ((old-len (length s)) + (new-len (- old-len (* 2 (count-string-char s #\%)))) + (new (make-string new-len)) + (p-old 0) + (p-new 0 (1+ p-new))) + ((= p-new new-len) new) + (declare (simple-string new) + (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))))))