r5097: *** empty log message ***
[kmrcl.git] / web-utils.lisp
index 1c475a8379a650c62fb0f259276f7e4ac9a2855d..56afffdd2d3bdc055f2c5221e2a1e215cc5c71e6 100644 (file)
@@ -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 "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>~%<?xml-stylesheet type=\"text/css\" href=\"http://b9.com/umlsxml.css\" ?>~%~%"))
+  #.(format nil "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>~%"))
 
 (defvar *standard-html-header* "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">")
 
                                                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))))))