Recently Written · git

clic

MIRROR ONLY Gopher client with pretty colours in Common Lisp

git clone https://github.com/equwal/clic

Log | Files | Refs


commit 04f5a2a34e4dcd4f26e89de3dc0dd81032eeda10
Solene Rapenne <solene@perso.pw>
2017-11-16 12:11:49 +0000

- new expect file for testing application with coverage report
- cleaning whitespace

 clic.lisp            | 51 ++++++++++++++++++++++++++++++---------------------
 interactive-test.exp | 26 ++++++++++++++++++--------
 2 files changed, 48 insertions(+), 29 deletions(-)
diff --git a/clic.lisp b/clic.lisp
index ade4ff8..f07c132 100644
--- a/clic.lisp
+++ b/clic.lisp
@@ -22,7 +22,7 @@
     #include <sys/ioctl.h>
     #include <limits.h>
     unsigned int getTerminalHeight()  {
-      struct winsize w; 
+      struct winsize w;
       return ioctl(1,TIOCGWINSZ,&w)<0?UINT_MAX:w.ws_row;}")
   (ffi:def-function
       ("getTerminalHeight" c-termsize)
@@ -155,31 +155,31 @@
 	       (print-with-color "selector 5 not implemented" 'red))
 
 	;; 6 Unix uuencoded file
-	(check "6" 
+	(check "6"
 	       (print-with-color "selector 6 not implemented" 'red))
 
 	;; 7 Index search server
-	(check "7" 
+	(check "7"
 	       (print-with-color "selector 7 not implemented" 'red))
 
 	;; 8 Telnet session
-	(check "8" 
+	(check "8"
 	       (print-with-color "selector 8 not implemented" 'red))
 
 	;; 9 Binary
-	(check "9" 
+	(check "9"
 	       (print-with-color "selector 9 not implemented" 'red))
 
 	;; + redundant server
-	(check "+" 
+	(check "+"
 	       (print-with-color "selector + not implemented" 'red))
 
 	;; T text based tn3270 session
-	(check "T" 
+	(check "T"
 	       (print-with-color "selector T not implemented" 'red))
 
 	;; g GIF file
-	(check "g" 
+	(check "g"
 	       (print-with-color "selector g not implemented" 'red))
 
 	;; I image
@@ -373,11 +373,23 @@
 (defun display-buffer(type)
   "display the buffer"
   (let ((rows (c-termsize)))
+
+    ;; we store the user input outside of the loop
+    ;; so if the user doesn't want to scroll
+    ;; we break the loop and then execute the command
     (let ((input nil))
       (loop for line across *buffer*
 	 counting line into row
 	 do
-	   (when (= row (- rows 1)) ; -1 for text displayed
+	   ;; display lines
+	   (cond
+	     ((string= "1" type)
+	      (formatted-output line))
+	     ((string= "0" type)
+	      (format t "~a~%" line)))
+
+	   ;; split and ask to scroll or to type a command
+	   (when (= row rows) ; -1 for text displayed
 	     (setf row 0)
 	     (format t "~a   press enter or a shell command ~a : "
 		     (get-color 'cyan)
@@ -386,14 +398,11 @@
 	     (let ((first-input (read-char)))
 	       (when (not (char= #\NewLine first-input))
 		 (unread-char first-input)
-		 (let ((input-text (format nil "~a" (read))))
+		 (let ((input-text (format nil "~a" (read-line nil nil))))
 		   (setf input input-text)
-		   (loop-finish)))))
-	 (cond
-	   ((string= "1" type)
-	    (formatted-output line))
-	   ((string= "0" type)
-	    (format t "~a~%" line))))
+		   (loop-finish))))))
+
+      ;; in case of shell command, do it
       (when input
 	(user-input input)))))
 
@@ -411,9 +420,6 @@
   ;; goes to the history !
   (push destination *history*)
 
-  (display-buffer (location-type destination))
-
-
   (when *offline*
     (let ((path (concatenate 'string
 			     "history/" (location-host destination)
@@ -427,10 +433,13 @@
 			:if-does-not-exist :create
 			:if-exists :supersede)
 
-	(loop for line in *buffer*
+	(loop for line across *buffer*
 	   while line
 	   do
-	     (format save-offline "~a~%" line))))))
+	     (format save-offline "~a~%" line)))))
+
+  (display-buffer (location-type destination)))
+
 
 (defun shell()
   "Shell for user interaction"
diff --git a/interactive-test.exp b/interactive-test.exp
index 1cc0192..8472b55 100644
--- a/interactive-test.exp
+++ b/interactive-test.exp
@@ -21,9 +21,14 @@ proc user_input {} {
 
     send "19\n"
     expect " : "
+    send "\nr\n"
+    expect " : "
 
     send "p\n"
     expect "clic => "
+
+    send "r\n"
+    expect "clic => "
     
     send "h\n"
     expect "clic => "
@@ -61,35 +66,40 @@ expect "* "
 
 send "(main)\n"
 set running [user_input]
-send "quit\n"
+send "(pop *history*) (p) (r)\n"
 expect "* "
 
-send "(main)\n"
-expect "clic => "
-
+send "19\n"
+expect " : "
 send "q\n"
 expect "* "
 
-send "(pop *history*) (p) (r)\n"
+send "(main)\n"
+expect "clic => "
+
+send "exit\n"
 expect "* "
 
 
 # add an argv to test argv parsing
-send "(setf *posix-argv* '(\"sbcl\" \"gopher://bitreich.org/0/usr/\"))\n"
+send "(setf *posix-argv* '(\"sbcl\" \"gopher://bitreich.org/0/documents/bitreich-manifesto.md\"))\n"
 expect "* "
 
 send "(main)\n"
+expect " : "
+send "q\n"
 expect "* "
 
 
 # add an argv to test argv parsing
-send "(setf *posix-argv* '(\"sbcl\" \"bitreich.org/0/usr/\"))\n"
+send "(setf *posix-argv* '(\"sbcl\" \"bitreich.org/1/usr/solene/\"))\n"
 expect "* "
 send "(main)\n"
+expect "clic => "
+send "q\n"
 expect "* "
 
 
-
 # add an argv to test argv parsing
 send "(setf *posix-argv* '(\"sbcl\" \"bitreich.org:70/\"))\n"
 expect "* "