Hello again,

I have a file which when compiling the compiler often complains about
the '(UNSIGNED-BYTE 8) type being unknown.  Interestingly, when I
recompile the same file just afterwards, this no longer occurs.


;;; Compiling (DEFUN URL-DECODE ...).
;;; Note:
;;;   in file test-httpd.lisp, position 14553
;;;   at (DEFUN URL-DECODE ...)
;;;   Unknown type '(UNSIGNED-BYTE 8). Assuming it is T.
;;; Note:
;;;   in file test-httpd.lisp, position 14553
;;;   at (DEFUN URL-DECODE ...)
;;;   Unknown type '(UNSIGNED-BYTE 8). Assuming it is T.


I'm not sure this is totally harmless (unless it's the warning that's
wrong and spurious), because in that particular case it's important
that the vector contain 8-bit octets (unfortunately, I'm not sure if
the position reported is the one in MAKE-ARRAY or FOR O (I should check
if emacs allows jumping at byte positions, though)...

Here is the function for which these notes happen:


;;; Decodes the URL supplied in STRING to another string, returning it.
(defun url-decode (string)
  (macrolet ((get-octet ()
               `(if (= input-max input-pos)
                    (loop-finish)
                    (prog1
                        (aref input input-pos)
                      (the fixnum (incf (the fixnum input-pos))))))
             (put-octet (o)
               `(vector-push ,o output)))
    (loop
       with input = (utf-8-string-encode string)
       with input-pos of-type fixnum = 0
       with input-max of-type fixnum = (length input)
       with output = (make-array (length input)
                                 :element-type '(unsigned-byte 8)
                                 :fill-pointer 0)
       for o of-type '(unsigned-byte 8) = (get-octet)
       when (= 37 o) do (let ((c1 (code-char (get-octet)))
                              (c2 (code-char (get-octet))))
                          (when (and (digit-char-p c1 16)
                                     (digit-char-p c2 16))
                            (put-octet (parse-integer
                                        (map 'string #'identity
`(,c1 ,c2)) :radix 16))))
       else when (= 43 o) do (put-octet 32)
       else do (put-octet o)
       finally (return (utf-8-string-decode output)))))


Thanks again,
-- 
Matt

------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
Ecls-list mailing list
Ecls-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ecls-list

Reply via email to