commit 35980a88b773e09e9ab64afbee3161ec3424edec
parent 4e92402f4aa026fb30171b7da76c4506c350b6ed
Author: Tomas Hlavaty <tom@logand.com>
Date: Sat, 8 Nov 2014 13:20:01 +0100
try clisp port
Diffstat:
5 files changed, 69 insertions(+), 27 deletions(-)
diff --git a/cl-rw.asd b/cl-rw.asd
@@ -36,7 +36,7 @@
(:file "xml")
(:file "email")
(:file "os")
- (:file "concurrency")
+ #-clisp(:file "concurrency")
(:file "css")
(:file "html")
(:file "socket")
@@ -44,7 +44,7 @@
(:file "http")
(:file "net")
(:file "calendar")
- (:file "ui")
+ #-clisp(:file "ui")
(:file "cas")
(:file "zip")
(:file "string")
diff --git a/http.lisp b/http.lisp
@@ -336,6 +336,7 @@
(cons (let ((*standard-output* stream)) (rw.html:html body))) ;; TODO xml, css...
(function (funcall body stream))))))))))
+#-clisp
(defun server-loop (socket quit handler host port)
(do ((q (or quit (rw:reader '(nil t)))))
((funcall q))
@@ -349,6 +350,7 @@
;; TODO also without threads
;; TODO also thread limit
;; TODO also thread pool
+#-clisp
(defun server (host port handler &key quit)
(let ((s (rw.socket:make-tcp-server-socket host port)))
(rw.concurrency:make-thread
diff --git a/os.lisp b/os.lisp
@@ -42,7 +42,7 @@
(when error-plist
(or (cdr (assoc code error-plist)) ""))
args)))))
- #-(or ccl ecl sbcl cmu #+nil clisp)
+ #-(or ccl ecl sbcl cmu clisp)
(error "RW.OS:MAKE-PROGRAM not ported")
#+ccl
(let ((p (ccl:run-program cmd
@@ -131,25 +131,50 @@
(sb-ext:process-output p)))
(:wait (sb-ext:process-wait p))
(:close (ext:process-close p)))))
- ;;#+clisp
- #+nil
- (let ((p (ext:run-program cmd
- :arguments args
- :input input
- :output output
- :error nil
- :wait nil)))
- (let ((status :running)) ;; TODO
- (if input
- (assert (eq :running status))
- (assert (member status '(:running :exited)))))
- (lambda (msg)
- (ecase msg
- (:fail (fail 0)) ;; TODO
- (:status-and-code (values :running 0)) ;; TODO
- (:streams (values p p))
- (:wait (ext:process-wait p)) ;; TODO
- (:close (close p)))))))
+ #+clisp ;; TODO how to binary io? how to get exit code?
+ (cond
+ ((and input output)
+ (multiple-value-bind (p i o)
+ (ext:run-program cmd
+ :arguments args
+ :input input
+ :output output
+ ;;:error nil
+ :wait nil)
+ (when (and p i o)
+ (close p)
+ (lambda (msg)
+ (ecase msg
+ (:fail (fail 0))
+ (:status-and-code (values :running 0))
+ (:streams (values i o))
+ (:wait)
+ (:close (close i)
+ (close o)))))))
+ ((or input output)
+ (let ((p (ext:run-program cmd
+ :arguments args
+ :input input
+ :output output
+ ;;:error nil
+ :wait nil)))
+ (when p
+ (lambda (msg)
+ (ecase msg
+ (:fail (fail 0))
+ (:status-and-code (values :running 0))
+ (:streams (values (when input p) (when output p)))
+ (:wait)
+ (:close (close p)))))))
+ (t
+ (let (z)
+ (lambda (msg)
+ (ecase msg
+ (:fail (fail z))
+ (:status-and-code (values :exited z))
+ (:streams)
+ (:wait (setq z (ext:run-program cmd :arguments args :wait t)))
+ (:close))))))))
(defun call-with-program (program fn)
(unwind-protect
diff --git a/socket.lisp b/socket.lisp
@@ -36,6 +36,7 @@
(defun close-socket (socket)
#-(or ccl ecl sbcl)
(error "TODO port RW.SOCKET::CLOSE-SOCKET")
+ ;; clisp socket:socket-server-close?
#+ccl
(close socket)
#+(or ecl sbcl)
@@ -49,8 +50,10 @@
`(call-with-socket ,socket (lambda (,var) ,@body)))
(defun make-tcp-server-socket (local-host local-port &key backlog)
- #-(or sbcl ecl ccl)
+ #-(or clisp sbcl ecl ccl)
(error "TODO port RW.SOCKET:MAKE-TCP-SERVER-SOCKET")
+ #+clisp
+ (socket:socket-server local-port :interface local-host :backlog backlog)
#+(or sbcl ecl)
(let ((x (make-instance 'sb-bsd-sockets:inet-socket
:type :stream
@@ -73,8 +76,10 @@
:reuse-address t))
(defun make-tcp-client-socket (remote-host remote-port)
- #-(or sbcl ecl ccl)
+ #-(or clisp sbcl ecl ccl)
(error "TODO port RW.SOCKET:MAKE-TCP-CLIENT-SOCKET")
+ #+clisp
+ (socket:socket-connect remote-port remote-host)
#+(or sbcl ecl)
(let ((x (make-instance 'sb-bsd-sockets:inet-socket
:type :stream
@@ -97,6 +102,8 @@
(defun make-udp-socket (&key local-host local-port remote-host remote-port)
#-(or ccl ecl sbcl)
(error "TODO port RW.SOCKET:MAKE-PASSIVE-UDP-SOCKET")
+ ;; #+clisp ;; rawsock not present by default
+ ;; (rawsock:socket :inet :dgram 0)
#+ccl
(ccl:make-socket :address-family :internet
:type :datagram
@@ -128,8 +135,10 @@
;; fd
(defun accept (socket)
- #-(or sbcl ecl ccl)
+ #-(or clisp sbcl ecl ccl)
(error "TODO port RW.SOCKET:ACCEPT")
+ #+clisp
+ (socket:socket-accept socket)
#+(or sbcl ecl)
(sb-bsd-sockets:socket-make-stream (sb-bsd-sockets:socket-accept socket)
:input t
diff --git a/string.lisp b/string.lisp
@@ -28,8 +28,11 @@
(in-package :rw.string)
(defun octets-to-string (x encoding)
- #-(or ecl ccl sbcl)
+ #-(or clisp ecl ccl sbcl)
(error "TODO port RW.STRING:OCTETS-TO-STRING")
+ #+clisp
+ (ext:convert-string-from-bytes
+ x (intern (string encoding) (find-package :charset)))
#+ecl
(let ((s (ext:make-sequence-input-stream x :external-format encoding)))
(coerce (rw:till (rw:peek-reader (rw:char-reader s)) nil nil nil) 'string))
@@ -39,8 +42,11 @@
(sb-ext:octets-to-string x :external-format encoding))
(defun string-to-octets (x encoding)
- #-(or ecl ccl sbcl)
+ #-(or clisp ecl ccl sbcl)
(error "TODO port RW.STRING:STRING-TO-OCTETS")
+ #+clisp
+ (ext:convert-string-to-bytes
+ x (intern (string encoding) (find-package :charset)))
#+ecl
(let ((z (make-array 42
:adjustable t