cl-rw

Layered streams for Common Lisp
git clone https://logand.com/git/cl-rw.git/
Log | Files | Refs

commit a3e43a0cb255ac3e759564ef8fe905d2c53472c6
parent e544123acf6db8554e1af06df0b133ea70faa9b3
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sat, 11 Apr 2015 11:32:03 +0200

partial allegro port

Diffstat:
Mconcurrency.lisp | 23+++++++++++++++++------
Msocket.lisp | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Mstring.lisp | 16++++++++++------
3 files changed, 84 insertions(+), 39 deletions(-)

diff --git a/concurrency.lisp b/concurrency.lisp @@ -34,35 +34,44 @@ (in-package :rw.concurrency) (defmacro with-lock ((lock) &body body) - #-(or ccl ecl mkcl sbcl) (error "RW.CONCURRENCY:WITH-LOCK not ported") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.CONCURRENCY:WITH-LOCK not ported") + #+allegro `(mp:with-process-lock (,lock) ,@body) #+ccl `(ccl:with-lock-grabbed (,lock) ,@body) #+ecl `(mp:with-lock (,lock) ,@body) #+mkcl `(mt:with-lock (,lock) ,@body) #+sbcl `(sb-concurrency::with-mutex (,lock) ,@body)) (defun make-lock (name) - #-(or ccl ecl mkcl sbcl) (error "RW.CONCURRENCY:MAKE-LOCK not ported") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.CONCURRENCY:MAKE-LOCK not ported") + #+allegro (mp:make-process-lock :name name) #+ccl (ccl:make-lock name) #+ecl (mp:make-lock :name name) #+mkcl (mt:make-lock :name name) #+sbcl (sb-concurrency::make-mutex :name (string name))) (defun make-semaphore () - #-(or ccl ecl mkcl sbcl) (error "RW.CONCURRENCY:MAKE-SEMAPHORE not ported") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.CONCURRENCY:MAKE-SEMAPHORE not ported") + #+allegro (mp:make-gate nil) #+ccl (ccl:make-semaphore) #+ecl (mp:make-semaphore) #+mkcl (mt:make-semaphore) #+sbcl (sb-concurrency::make-semaphore)) (defun signal-semaphore (x) - #-(or ccl ecl mkcl sbcl) (error "RW.CONCURRENCY:SIGNAL-SEMAPHORE not ported") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.CONCURRENCY:SIGNAL-SEMAPHORE not ported") + #+allegro (mp:put-semaphore x) #+ccl (ccl:signal-semaphore x) #+ecl (mp:signal-semaphore x) #+mkcl (mt:semaphore-signal x) #+sbcl (sb-concurrency::signal-semaphore x)) (defun wait-on-semaphore (x) - #-(or ccl ecl mkcl sbcl) (error "RW.CONCURRENCY:WAIT-ON-SEMAPHORE not ported") + #-(or ccl ecl mkcl sbcl) + (error "RW.CONCURRENCY:WAIT-ON-SEMAPHORE not ported") #+ccl (ccl:wait-on-semaphore x) #+ecl (mp:wait-on-semaphore x) #+mkcl (mt:semaphore-wait x) @@ -98,7 +107,9 @@ ;; (funcall q) (defun make-thread (name fn) - #-(or ccl ecl mkcl sbcl) (error "RW.CONCURRENCY:MAKE-THREAD not ported") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.CONCURRENCY:MAKE-THREAD not ported") + #+allegro (mp:process-run-function name fn) #+ccl (ccl:process-run-function name fn) #+ecl (mp:process-run-function name fn) #+mkcl (mt:thread-run-function name fn) diff --git a/socket.lisp b/socket.lisp @@ -43,9 +43,9 @@ (defstruct (ipv6-address (:constructor %make-ipv6-address)) native string) (defun next-ipv4-address (r) - (#-ccl + (#-(or allegro ccl) ipv4-integer-to-vector - #+ccl + #+(or allegro ccl) progn (flet ((one () (cond @@ -126,14 +126,14 @@ (string (%make-ipv4-address :native (parse-ipv4-address x) :string x)) (integer (%make-ipv4-address :native - #-ccl (ipv4-integer-to-vector x) - #+ccl x + #-(or allegro ccl) (ipv4-integer-to-vector x) + #+(or allegro ccl) x :string (ipv4-integer-to-dotted x))) (vector (assert (= 4 (length x))) (%make-ipv4-address :native - #-ccl x - #+ccl (ipv4-vector-to-integer x) + #-(or allegro ccl) x + #+(or allegro ccl) (ipv4-vector-to-integer x) :string (ipv4-vector-to-dotted x))))) ;;(make-ipv4-address "127.0.0.1") @@ -142,9 +142,9 @@ ;;(make-ipv4-address 0) (defun next-ipv6-address (r) - (#-ccl + (#-(or allegro ccl) ipv6-integer-to-vector - #+ccl + #+(or allegro ccl) progn (flet ((chain (n) (loop @@ -235,14 +235,14 @@ (string (%make-ipv6-address :native (parse-ipv6-address x) :string x)) (integer (%make-ipv6-address :native - #-ccl (ipv6-integer-to-vector x) - #+ccl x + #-(or allegro ccl) (ipv6-integer-to-vector x) + #+(or allegro ccl) x :string (ipv6-integer-to-string x))) (vector (assert (= 8 (length x))) (%make-ipv6-address :native - #-ccl x - #+ccl (ipv6-vector-to-integer x) + #-(or allegro ccl) x + #+(or allegro ccl) (ipv6-vector-to-integer x) :string (ipv6-vector-to-string x))))) ;;(make-ipv6-address "f:e:d:c:b:a:9:8") @@ -258,10 +258,10 @@ (ipv6-address (ipv6-address-native x))))) (defun close-socket (socket) - #-(or ccl ecl mkcl sbcl) - (error "TODO port RW.SOCKET::CLOSE-SOCKET") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.SOCKET::CLOSE-SOCKET not ported") ;; clisp socket:socket-server-close? - #+ccl + #+(or allegro ccl) (close socket) #+(or ecl sbcl mkcl) (sb-bsd-sockets:socket-close socket)) @@ -274,8 +274,16 @@ `(call-with-socket ,socket (lambda (,var) ,@body))) (defun make-tcp-server-socket (local-host local-port &key backlog) - #-(or clisp sbcl ecl mkcl ccl) - (error "TODO port RW.SOCKET:MAKE-TCP-SERVER-SOCKET") + #-(or allegro clisp sbcl ecl mkcl ccl) + (error "RW.SOCKET:MAKE-TCP-SERVER-SOCKET not ported") + #+allegro + (socket:make-socket :connect :passive + :address-family :internet + :type :stream + :format :bivalent ;; TODO :binary + :local-host (native-ip-address local-host) + :local-port local-port + :reuse-address t) #+clisp (socket:socket-server local-port :interface local-host :backlog backlog) #+(or sbcl ecl mkcl) @@ -300,8 +308,15 @@ :reuse-address t)) (defun make-tcp-client-socket (remote-host remote-port) - #-(or clisp sbcl ecl mkcl ccl) - (error "TODO port RW.SOCKET:MAKE-TCP-CLIENT-SOCKET") + #-(or allegro clisp sbcl ecl mkcl ccl) + (error "RW.SOCKET:MAKE-TCP-CLIENT-SOCKET not ported") + #+allegro + (socket:make-socket :connect :active + :address-family :internet + :type :stream + :format :bivalent ;; TODO :binary + :remote-host (native-ip-address remote-host) + :remote-port remote-port) #+clisp (socket:socket-connect remote-port remote-host) #+(or sbcl ecl mkcl) @@ -324,8 +339,15 @@ :remote-port remote-port)) (defun make-udp-socket (&key local-host local-port remote-host remote-port) - #-(or ccl ecl mkcl sbcl) - (error "TODO port RW.SOCKET:MAKE-PASSIVE-UDP-SOCKET") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.SOCKET:MAKE-PASSIVE-UDP-SOCKET not ported") + #+allegro + (socket:make-socket :address-family :internet + :type :datagram + :local-host (native-ip-address local-host) + :local-port local-port + :remote-host (native-ip-address remote-host) + :remote-port remote-port) ;; #+clisp ;; rawsock not present by default ;; (rawsock:socket :inet :dgram 0) #+ccl @@ -359,8 +381,10 @@ ;; fd (defun accept (socket) - #-(or clisp sbcl ecl mkcl ccl) - (error "TODO port RW.SOCKET:ACCEPT") + #-(or allegro clisp sbcl ecl mkcl ccl) + (error "RW.SOCKET:ACCEPT not ported") + #+allegro + (socket:accept-connection socket) #+clisp (socket:socket-accept socket) #+(or sbcl ecl mkcl) @@ -372,8 +396,12 @@ (ccl:accept-connection socket)) (defun udp-send (socket buf len &key remote-host remote-port) - #-(or ccl ecl mkcl sbcl) - (error "TODO port RW.SOCKET:UDP-SEND") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.SOCKET:UDP-SEND not ported") + #+allegro + (socket:send-to socket buf len + :remote-host (native-ip-address remote-host) + :remote-port remote-port) #+ccl (ccl:send-to socket buf len :remote-host (native-ip-address remote-host) @@ -384,8 +412,10 @@ remote-port))) (defun udp-receive (socket buf len) - #-(or ccl ecl mkcl sbcl) - (error "TODO port RW.SOCKET:UDP-RECEIVE") + #-(or allegro ccl ecl mkcl sbcl) + (error "RW.SOCKET:UDP-RECEIVE not ported") + #+allegro + (socket:receive-from socket len :buffer buf) #+ccl (ccl:receive-from socket len :buffer buf) #+(or ecl mkcl sbcl) diff --git a/string.lisp b/string.lisp @@ -28,8 +28,8 @@ (in-package :rw.string) (defun octets-to-string (x encoding) - #-(or clisp ecl ccl sbcl) - (error "TODO port RW.STRING:OCTETS-TO-STRING") + #-(or allegro clisp ecl ccl sbcl allegro) + (error "RW.STRING:OCTETS-TO-STRING not ported") #+clisp (ext:convert-string-from-bytes x (intern (string encoding) (find-package :charset))) @@ -39,11 +39,13 @@ #+ccl (ccl:decode-string-from-octets x :external-format encoding) #+sbcl - (sb-ext:octets-to-string x :external-format encoding)) + (sb-ext:octets-to-string x :external-format encoding) + #+allegro + (excl:octets-to-string x :external-format encoding)) (defun string-to-octets (x encoding) - #-(or clisp ecl ccl sbcl) - (error "TODO port RW.STRING:STRING-TO-OCTETS") + #-(or allegro clisp ecl ccl sbcl allegro) + (error "RW.STRING:STRING-TO-OCTETS not ported") #+clisp (ext:convert-string-to-bytes x (intern (string encoding) (find-package :charset))) @@ -59,4 +61,6 @@ #+ccl (ccl:encode-string-to-octets x :external-format encoding) #+sbcl - (sb-ext:string-to-octets x :external-format encoding)) + (sb-ext:string-to-octets x :external-format encoding) + #+allegro + (excl:string-to-octets x :external-format encoding))