summaryrefslogtreecommitdiff
path: root/dev-java/bsh/files/bsh2-readline.patch
blob: f6aa7d4aee7df1cb74acec619a5c77426761ecda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
--- BeanShell/src/bsh/Interpreter.java~	2003-09-03 19:56:58.000000000 -0400
+++ BeanShell/src/bsh/Interpreter.java	2004-01-25 09:59:41.730059108 -0500
@@ -38,6 +38,13 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
 
+import bsh.util.BshCompleter;
+import bsh.util.NameCompletionTable;
+import bsh.classpath.ClassManagerImpl;
+import org.gnu.readline.Readline;
+import org.gnu.readline.ReadlineLibrary;
+import org.gnu.readline.ReadlineReader;
+
 /**
 	The BeanShell script interpreter.
 
@@ -394,10 +401,59 @@
 			else
 				src = System.in;
 
-            Reader in = new CommandLineReader( new InputStreamReader(src));
-            Interpreter interpreter = 
-				new Interpreter( in, System.out, System.err, true );
-        	interpreter.run();
+            Reader in = null;
+            boolean usingReadline = false;
+            String backingLib = System.getProperty("bsh.console.readlinelib"); System.out.println("backingLib is " + backingLib);
+            if (backingLib != null && backingLib.length() > 0) {
+                try {
+                    File history = new File(System.getProperty("user.home") +
+                                            File.separator + ".bsh_history");
+                    if (!history.exists()) {
+                        try {
+                            history.createNewFile();
+                        } catch(IOException ioe) {
+                            debug("Unable to create history  " + history.getAbsolutePath());
+                        }
+                    }
+                    ReadlineLibrary lib = ReadlineLibrary.byName(backingLib);
+                    // should I wrap CommandLineReader around it?
+                    if (history.canWrite() && history.canRead()) {
+                        in = new ReadlineReader("bsh % ", history,lib);
+                    } else {
+                        in = new ReadlineReader("bsh % ",lib);
+                        debug("Unable to read/write history  " + history.getAbsolutePath());
+                    }
+                } catch (IOException ioe) {
+                    System.err.println("Unable to invoke ReadlineReader " +
+                                       "due to: " + ioe);
+                }
+            }
+            if (in == null)
+                in = new CommandLineReader( new InputStreamReader(src));
+            else
+                usingReadline = true;
+            Interpreter interpreter =
+                new Interpreter( in, System.out, System.err, true );
+            if (usingReadline) {
+                NameCompletionTable nct = new NameCompletionTable();
+                nct.add(interpreter.getNameSpace());
+
+                /** ClassManager does a lot of chatting to the stdout,
+                 *  so this has been commented out for the time being
+                 **/
+
+//              try {
+//                  BshClassManager bcm = BshClassManager.getClassManager();
+//                      if (bcm != null) {
+//                          nct.add(((ClassManagerImpl)bcm).getClassPath());
+//                      }
+//                  } catch(ClassPathException cpe) {
+//                      debug("classpath exception in name compl:" + cpe);
+//                  }
+
+                Readline.setCompleter(new BshCompleter(nct));
+            }
+            interpreter.run();
         }
     }
 
@@ -445,7 +501,7 @@
                 System.err.flush();
                 Thread.yield();  // this helps a little
 
-                if ( interactive )
+                if ( interactive && !(in instanceof ReadlineReader))
                     print( getBshPrompt() );
 
                 eof = Line();
@@ -548,10 +604,17 @@
             }
         }
 
-		if ( interactive && exitOnEOF )
-			System.exit(0);
+        if ( interactive && exitOnEOF ) {
+            /* should be done for all streams in general, but this
+             * ensures that the history for readline is flushed */
+            try {
+                in.close();
+            } catch (IOException ioe) {
+            }
+	
+            System.exit(0);
     }
-
+   }
 	// begin source and eval
 
 	/**
--- /dev/null	2003-10-19 02:52:03.000000000 -0400
+++ BeanShell/src/bsh/util/BshCompleter.java	2004-01-25 10:14:10.184458217 -0500
@@ -0,0 +1,38 @@
+package bsh.util;
+
+import org.gnu.readline.ReadlineCompleter;
+
+/**
+ * An adapter for org.gnu.readline's ReadlineCompleter interface to map to
+ * BeanShell's NameCompleter interface.
+ *
+ * @see org.gnu.readline.ReadlineReader
+ * @version $Revision: 1.1 $
+ * @author Shane Celis <shane@terraspring.com>
+ **/
+public class BshCompleter implements ReadlineCompleter {
+
+    private NameCompletion completer;
+
+    /**
+     * Constructs a <code>ReadlineCompleter</code> out of a
+     * <code>NameCompleter</code> object.
+     **/
+    public BshCompleter(NameCompletion completer) {
+        this.completer = completer;
+    }
+
+    /**
+     * Returns String of completion if unambiguous, otherwise null
+     **/
+    public String completer(String text, int state) {
+        // Not sure what state is used for in ReadlineCompleter
+        String[] completions = completer.completeName(text);
+        if (completions.length == 1 && state == 0) {
+            return completions[0];
+        } else {
+            return null;        // ambiguous result
+        }
+    }
+
+}