on master help sign in
- Formatting

- Set Ps1 and Ps2 in native repl mode.

commit35bc04ba00d15c508cd16d954e5b928e1a33c208 authorRob Blanckaert <basicer@basicer.com> dateTue 16 Oct 2018, 20:55 (8 years ago) parent909438a
4 files changed+78−29
src/language.go+23−9 src/languages/python2/main.go+24−8 src/languages/python3/main.go+25−9 src/main.go+6−3
src/language.go+23−9
@@ -1,11 +1,11 @@
11package main
22
3−import(
3+import (
4+ "fmt"
45 "os"
6+ "path/filepath"
57 "plugin"
6− "fmt"
78 "runtime"
8− "path/filepath"
99)
1010
1111type PluginBase interface {
@@ -39,13 +39,18 @@ type PluginREPLLikeEval interface {
3939 REPLLikeEval(code string)
4040}
4141
42+type PluginSetPrompts interface {
43+ PluginBase
44+ SetPrompts(ps1, ps2 string)
45+}
46+
4247type Langauge struct {
4348 ptr PluginBase
4449}
4550
4651func finalizer(f *Langauge) {
47− fmt.Println("a finalizer has run.")
48−}
52+ fmt.Println("a finalizer has run.")
53+}
4954
5055func GetLanguage(name string) *Langauge {
5156 base := "."
@@ -80,10 +85,10 @@ func GetLanguage(name string) *Langauge {
8085 os.Exit(1)
8186 }
8287
83− result := &Langauge {
88+ result := &Langauge{
8489 ptr: lang,
8590 }
86− lang.Open();
91+ lang.Open()
8792 runtime.SetFinalizer(result, finalizer)
8893 return result
8994}
@@ -126,7 +131,7 @@ func (lang Langauge) EvalFile(file string, args []string) {
126131
127132func (lang Langauge) REPL() {
128133 repl, ok := lang.ptr.(PluginREPL)
129− if ok {
134+ if ok {
130135 repl.REPL()
131136 } else {
132137 lang.InternalREPL()
@@ -136,8 +141,17 @@ func (lang Langauge) REPL() {
136141func (lang Langauge) InternalREPL() {
137142 for {
138143 line, err := Linenoise(ps1)
139− if err != nil { break }
144+ if err != nil {
145+ break
146+ }
140147 lang.REPLLikeEval(line)
141148 LinenoiseHistoryAdd(line)
142149 }
143150}
151+
152+func (lang Langauge) SetPrompts(ps1, ps2 string) {
153+ ee, ok := lang.ptr.(PluginSetPrompts)
154+ if ok {
155+ ee.SetPrompts(ps1, ps2)
156+ }
157+}
src/languages/python2/main.go+24−8
@@ -19,7 +19,7 @@ void pry_eval_file(FILE* f, const char* file, int argn, const char *argv) {
1919const char* pry_eval(const char *code, int start) {
2020
2121 PyObject *m, *d, *s, *v;
22− PyCodeObject *c;
22+ PyObject *c;
2323 m = PyImport_AddModule("__main__");
2424
2525 if (m == NULL) return NULL;
@@ -46,17 +46,24 @@ const char* pry_eval(const char *code, int start) {
4646 return str;
4747}
4848
49+void pry_set_prompts(const char* ps1, const char* ps2) {
50+ PyObject *po1 = PyString_FromString(ps1);
51+ PyObject *po2 = PyString_FromString(ps2);
52+ PySys_SetObject("ps1", po1);
53+ PySys_SetObject("ps2", po2);
54+ Py_DECREF(po1);
55+ Py_DECREF(po2);
56+}
57+
4958*/
5059import "C"
5160
5261import (
53− "unsafe"
5462 "strings"
63+ "unsafe"
5564)
5665
57−
5866type Python struct {
59−
6067}
6168
6269func (p Python) Open() {
@@ -83,10 +90,10 @@ func (p Python) EvalFile(file string, args []string) {
8390 handle := C.stdin
8491 cfile := C.CString(file)
8592 defer C.free(unsafe.Pointer(cfile))
86−
93+
8794 if file != "-" {
8895 cmode := C.CString("r")
89−
96+
9097 defer C.free(unsafe.Pointer(cmode))
9198 handle = C.fopen(cfile, cmode)
9299 defer C.fclose(handle)
@@ -94,7 +101,7 @@ func (p Python) EvalFile(file string, args []string) {
94101
95102 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
96103 defer C.free(unsafe.Pointer(argv))
97− C.pry_eval_file(handle, cfile, C.int(len(args) + 1), argv)
104+ C.pry_eval_file(handle, cfile, C.int(len(args)+1), argv)
98105}
99106
100107func (p Python) REPLLikeEval(code string) {
@@ -109,7 +116,16 @@ func (p Python) REPL() {
109116 C.PyRun_InteractiveLoopFlags(C.stdin, fn, nil)
110117}
111118
112−func (p Python) Close() {
119+func (p Python) SetPrompts(ps1, ps2 string) {
120+ cps1 := C.CString(ps1)
121+ defer C.free(unsafe.Pointer(cps1))
122+ cps2 := C.CString(ps2)
123+ defer C.free(unsafe.Pointer(cps2))
124+
125+ C.pry_set_prompts(cps1, cps2)
126+}
127+
128+func (p Python) Close() {
113129 C.Py_Finalize()
114130}
115131
src/languages/python3/main.go+25−9
@@ -5,7 +5,7 @@ package main
55#include <Python.h>
66
77void pry_eval_file(FILE* f, const char* file, int argn, const char *argv) {
8− const wchar_t* xargv[argn+1];
8+ wchar_t* xargv[argn+1];
99 const char* ptr = argv;
1010 for (int i = 0; i < argn; ++i) {
1111 xargv[i] = Py_DecodeLocale(ptr, NULL);
@@ -19,7 +19,7 @@ void pry_eval_file(FILE* f, const char* file, int argn, const char *argv) {
1919const char* pry_eval(const char *code, int start) {
2020
2121 PyObject *m, *d, *s, *v;
22− PyCodeObject *c;
22+ PyObject *c;
2323 m = PyImport_AddModule("__main__");
2424
2525 if (m == NULL) return NULL;
@@ -46,17 +46,24 @@ const char* pry_eval(const char *code, int start) {
4646 return str;
4747}
4848
49+void pry_set_prompts(const char* ps1, const char* ps2) {
50+ PyObject *po1 = PyUnicode_FromString(ps1);
51+ PyObject *po2 = PyUnicode_FromString(ps2);
52+ PySys_SetObject("ps1", po1);
53+ PySys_SetObject("ps2", po2);
54+ Py_DECREF(po1);
55+ Py_DECREF(po2);
56+}
57+
4958*/
5059import "C"
5160
5261import (
53− "unsafe"
5462 "strings"
63+ "unsafe"
5564)
5665
57−
5866type Python struct {
59−
6067}
6168
6269func (p Python) Open() {
@@ -83,10 +90,10 @@ func (p Python) EvalFile(file string, args []string) {
8390 handle := C.stdin
8491 cfile := C.CString(file)
8592 defer C.free(unsafe.Pointer(cfile))
86−
93+
8794 if file != "-" {
8895 cmode := C.CString("r")
89−
96+
9097 defer C.free(unsafe.Pointer(cmode))
9198 handle = C.fopen(cfile, cmode)
9299 defer C.fclose(handle)
@@ -94,7 +101,7 @@ func (p Python) EvalFile(file string, args []string) {
94101
95102 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
96103 defer C.free(unsafe.Pointer(argv))
97− C.pry_eval_file(handle, cfile, C.int(len(args) + 1), argv)
104+ C.pry_eval_file(handle, cfile, C.int(len(args)+1), argv)
98105}
99106
100107func (p Python) REPLLikeEval(code string) {
@@ -109,7 +116,16 @@ func (p Python) REPL() {
109116 C.PyRun_InteractiveLoopFlags(C.stdin, fn, nil)
110117}
111118
112−func (p Python) Close() {
119+func (p Python) SetPrompts(ps1, ps2 string) {
120+ cps1 := C.CString(ps1)
121+ defer C.free(unsafe.Pointer(cps1))
122+ cps2 := C.CString(ps2)
123+ defer C.free(unsafe.Pointer(cps2))
124+
125+ C.pry_set_prompts(cps1, cps2)
126+}
127+
128+func (p Python) Close() {
113129 C.Py_Finalize()
114130}
115131
src/main.go+6−3
@@ -46,6 +46,7 @@ func main() {
4646 if !quiet {
4747 fmt.Println(lang.Version())
4848 }
49+
4950 if code != "" {
5051 lang.Eval(code)
5152 }
@@ -60,12 +61,14 @@ func main() {
6061 lang.EvalFile(args[0], args[1:])
6162 }
6263 }
64+
6365 if interactive {
66+ lang.SetPrompts(ps1, ps2)
6467 lang.REPL()
6568 } else if ourInteractive {
66− LinenoiseSetCompleter(func(s string) []string {
67− return []string{s + "A", s + "B", s + "B"}
68− })
69+ //LinenoiseSetCompleter(func(s string) []string {
70+ // return []string{s + "A", s + "B", s + "B"}
71+ //})
6972 lang.InternalREPL()
7073 }
7174