Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-05-24

KMRCLを眺める(156) DECODE-URI-QUERY-STRING

| 14:09 | KMRCLを眺める(156) DECODE-URI-QUERY-STRING - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(156) DECODE-URI-QUERY-STRING - わだばLisperになる

今回は、KMRCLのweb-utils.lispからDECODE-URI-QUERY-STRINGです。

エンコードされたURIをデコードするというもので以前眺めた、strings.lispのDECODE-URI-STRINGと殆ど同じですが、クエリ部分を想定しているので+の解釈が違っています。

(SET' URI "foo%2Fbar%2Fbaz+quux")

(KL:DECODE-URI-STRING URI)
⇒ "foo/bar/baz+quux"

(KL:DECODE-URI-QUERY-STRING URI)
⇒ "foo/bar/baz quux"

定義は、

(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))))))

となっていますが、これも大体DECODE-URI-STRINGと同じです。