;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id: web-utils.lisp,v 1.10 2003/06/06 21:59:30 kevin Exp $
+;;;; $Id: web-utils.lisp,v 1.16 2003/06/17 06:18:09 kevin Exp $
;;;;
;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
;;; HTML/XML constants
(defvar *standard-xml-header*
- #.(format nil "<?xml version=\"1.0\" ?>~%<?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\">")
(defvar *standard-xhtml-header*
- #.(format nil "<?xml version=\"1.0\" standalone=\"yes\"?>~%<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"))
+ #.(format nil "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>~%<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"))
;;; User agent functions
(defun user-agent-ie-p (agent)
"Takes a user-agent string and returns T for Internet Explorer."
- (when (or (string-equal "Microsoft" (subseq agent 0 (length "Microsoft")))
- (string-equal "Internet Explore" (subseq agent 0 (length "Internet Explore")))
- (search "MSIE" agent))
- t))
+ (or (string-starts-with "Microsoft" agent)
+ (string-starts-with "Internet Explore" agent)
+ (search "Safari" agent)
+ (search "MSIE" agent)))
;;; URL Functions
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 (the fixnum (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))))))