commit 4220b3288dea3f805274c8a7d5f3bc13bfbbb843
parent e1a2beb5435794502beec95a9e66edb366e1b7ae
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Tue,  5 Apr 2011 16:19:12 -0300
Added dummy char-ready? to the ground environment. (TODO: actually check if there are waiting chars, this dummy version always returns true).
Diffstat:
3 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/src/kgports.c b/src/kgports.c
@@ -302,17 +302,37 @@ void read_peek_char(klisp_State *K, TValue *xparams, TValue ptree,
 
 
 /* 15.1.? read-char */
-/* TODO */
+/* uses read_peek_char */
 
 /* 15.1.? peek-char */
-/* TODO */
+/* uses read_peek_char */
 
 /* 15.1.? char-ready? */
-/* TODO */
 /* XXX: this always return #t, proper behaviour requires platform 
-   specific code (probably select for posix, a thread for windows
-   (at least for files & consoles), I think pipes and sockets may
-   have something */
+   specific code (probably select for posix & a thread for windows
+   (at least for files & consoles, I think pipes and sockets may
+   have something) */
+void char_readyp(klisp_State *K, TValue *xparams, TValue ptree, TValue denv)
+{
+    UNUSED(xparams);
+    UNUSED(denv);
+    
+    TValue port = ptree;
+    if (!get_opt_tpar(K, "char-ready?", K_TPORT, &port)) {
+	port = kcdr(K->kd_in_port_key); /* access directly */
+    } else if (!kport_is_input(port)) {
+	klispE_throw(K, "char-ready?: the port should be an input port");
+	return;
+    } 
+    if (kport_is_closed(port)) {
+	klispE_throw(K, "char-ready?: the port is already closed");
+	return;
+    }
+
+    /* TODO: check if there are pending chars */
+    kapply_cc(K, KTRUE);
+}
+
 
 /* 15.2.1 call-with-input-file, call-with-output-file */
 /* XXX: The report is incomplete here... for now use an empty environment, 
diff --git a/src/kgports.h b/src/kgports.h
@@ -64,11 +64,11 @@ void read_peek_char(klisp_State *K, TValue *xparams, TValue ptree,
 /* uses read_peek_char */
 
 /* 15.1.? char-ready? */
-/* TODO */
 /* XXX: this always return #t, proper behaviour requires platform 
    specific code (probably select for posix, a thread for windows
    (at least for files & consoles), I think pipes and sockets may
    have something */
+void char_readyp(klisp_State *K, TValue *xparams, TValue ptree, TValue denv);
 
 /* 15.2.1 call-with-input-file, call-with-output-file */
 void call_with_file(klisp_State *K, TValue *xparams, TValue ptree, 
diff --git a/src/kground.c b/src/kground.c
@@ -972,11 +972,11 @@ void kinit_ground_env(klisp_State *K)
 		    b2tv(true));
 
     /* 15.1.? char-ready? */
-    /* TODO */
     /* XXX: this always return #t, proper behaviour requires platform 
        specific code (probably select for posix, a thread for windows
        (at least for files & consoles), I think pipes and sockets may
        have something */
+    add_applicative(K, ground_env, "char-ready?", char_readyp, 0);
 
     /* 
     ** 15.2 Library features