[seed] Improve multiline support in REPL



commit f2cec5dacdd29ffaeb635d9f33a514782b5faf99
Author: Robert Carr <racarr svn gnome org>
Date:   Thu May 7 04:19:51 2009 -0400

    Improve multiline support in REPL
---
 examples/repl.js                 |   20 ++++++++++----------
 modules/readline/seed-readline.c |   31 ++++++++++++++++++++++++++++++-
 2 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/examples/repl.js b/examples/repl.js
index 113bcf5..ad410d6 100755
--- a/examples/repl.js
+++ b/examples/repl.js
@@ -2,6 +2,7 @@
 
 readline = imports.readline;
 sandbox = imports.sandbox;
+os = imports.os;
 
 var lastLastLength = '-1';
 
@@ -11,26 +12,25 @@ context.add_globals();
 bind_cr = function(){
     var buffer = readline.buffer();
     if (buffer.length == lastLastLength)
-	readline.rl_done();
+	readline.done();
     try {
 	Seed.check_syntax(buffer);
-	readline.rl_done();
+	readline.done();
     }
     catch (e){
-	if (buffer[buffer.length] == '\n' || buffer[buffer.length] == '\r')
-	    readline.rl_done();
+	os.write(1, "\n..");
+	lastLastLength = buffer.length;
+	return;
     }
-    Seed.print("");
+    os.write(1, "\n");
     lastLastLength = buffer.length;
 }
 
-bind_tab = function(){
-    os.write(1, "\t");
-}
-
 readline.bind('\n', bind_cr);
 readline.bind('\r', bind_cr);
-readline.bind('\t', bind_tab);
+readline.bind('\t', function(){
+    readline.insert("\t");
+});
 
 while(1){
     try{
diff --git a/modules/readline/seed-readline.c b/modules/readline/seed-readline.c
index a49b039..4348aa7 100644
--- a/modules/readline/seed-readline.c
+++ b/modules/readline/seed-readline.c
@@ -96,6 +96,30 @@ seed_rl_buffer(SeedContext ctx,
 }
 
 static SeedValue
+seed_rl_insert(SeedContext ctx,
+	       SeedObject function,
+	       SeedObject this_object,
+	       size_t argumentCount,
+	       const SeedValue arguments[], 
+	       SeedValue * exception)
+{
+  gchar *ins;
+  gint ret;
+  if (argumentCount != 1)
+    {
+      seed_make_exception (ctx, exception, "ArgumentError", 
+			   "readline.insert expected 1 argument, got %d", 
+			   argumentCount);
+      return seed_make_null (ctx);
+    }
+  ins = seed_value_to_string (ctx, arguments[0], exception);
+  ret = rl_insert_text (ins);
+  g_free (ins);
+  
+  return seed_value_from_int (ctx, ret, exception);
+}
+
+static SeedValue
 seed_readline(SeedContext ctx,
 	      SeedObject function,
 	      SeedObject this_object,
@@ -164,7 +188,7 @@ seed_module_init(SeedEngine * local_eng)
 		       (SeedObject) namespace_ref);
 
   seed_create_function(eng->context,
-		       "rl_done",
+		       "done",
 		       (SeedFunctionCallback) seed_rl_done,
 		       (SeedObject) namespace_ref);
 
@@ -173,6 +197,11 @@ seed_module_init(SeedEngine * local_eng)
 		       (SeedFunctionCallback) seed_rl_buffer,
 		       (SeedObject) namespace_ref);
 
+  seed_create_function(eng->context,
+		       "insert",
+		       (SeedFunctionCallback) seed_rl_insert,
+		       (SeedObject) namespace_ref);
+
   return namespace_ref;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]