From efc0fdce1f7698363cf9beba46b8906ef6cfee29 Mon Sep 17 00:00:00 2001 From: Stelian Ionescu Date: Mon, 18 Feb 2008 09:14:36 +0100 Subject: [PATCH] Add reader macro for literal INET addresses. Examples: @127.0.0.1 , @FF05::2 Signed-off-by: Stelian Ionescu --- net.sockets/address.lisp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/net.sockets/address.lisp b/net.sockets/address.lisp index e1a9402..23a36a1 100644 --- a/net.sockets/address.lisp +++ b/net.sockets/address.lisp @@ -304,18 +304,35 @@ returned unmodified." (address-name address))) (defmethod print-object ((address ipv4-address) stream) - (print-unreadable-object (address stream :type nil :identity nil) - (format stream "IPv4 address: ~A" (address-to-string address)))) + (format stream "@~A" (address-to-string address))) (defmethod print-object ((address ipv6-address) stream) - (print-unreadable-object (address stream :type nil :identity nil) - (format stream "IPv6 address: ~A" (address-to-string address)))) + (format stream "@~A" (address-to-string address))) (defmethod print-object ((address local-address) stream) (print-unreadable-object (address stream :type nil :identity nil) (format stream "Unix socket address: ~A. Abstract: ~:[no~;yes~]" (address-to-string address) (abstract-address-p address)))) +;;;; Reader Macro + +(defun read-literal-ip-address (stream &optional c n) + (declare (ignore c n)) + (loop :with sstr := (make-string-output-stream) + :for char := (read-char stream nil nil) + :while char + :do (cond ((or (digit-char-p char 16) + (member char '(#\. #\:) :test #'char=)) + (write-char char sstr)) + (t + (unread-char char stream) + (loop-finish))) + :finally (return (or (ensure-address (get-output-stream-string sstr) + :errorp nil) + (error 'reader-error :stream stream))))) + +(set-macro-character #\@ 'read-literal-ip-address t) + ;;;; Equality Methods (defun vector-equal (v1 v2) -- 2.11.4.GIT