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-04-04

KMRCLを眺める(131) DECODE-URI-STRING

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

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

名前のとおり前回のENCODE-URI-STRINGの逆でデコードを行ないます。

動作は、

(KL:DECODE-URI-STRING "R6RS%20Scheme")
⇒ "R6RS Scheme"

というところ

定義は

(defun decode-uri-string (query)
  "Unescape non-alphanumeric characters for URI fields"
  (declare (simple-string query)
           (optimize (speed 3) (safety 0) (space 0)))
  (do* ((count (count-string-char query #\%))
        (len (length query))
        (new-len (- len (* 2 count)))
        (str (make-string new-len))
        (spos 0 (1+ spos))
        (dpos 0 (1+ dpos)))
      ((= spos len) str)
    (declare (fixnum count len new-len spos dpos)
             (simple-string str))
    (let ((ch (schar query spos)))
      (if (char= #\% ch)
          (let ((c1 (charhex (schar query (1+ spos))))
                (c2 (charhex (schar query (+ spos 2)))))
            (declare (fixnum c1 c2))
            (setf (schar str dpos)
                  (code-char (logior c2 (ash c1 4))))
            (incf spos 2))
        (setf (schar str dpos) ch)))))

となっていて中身の処理手順も大体、ENCODE-URI-STRINGの逆になっています。

ENCODE-URI-STRINGと同様ASCII以外の処理は考慮されていない様子。