Skip to content

Commit

Permalink
Merge pull request #286 from majiru/plan9-support
Browse files Browse the repository at this point in the history
Plan9 support
  • Loading branch information
candid82 authored Nov 8, 2019
2 parents 2ff0235 + cddb12f commit 036701d
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 92 deletions.
2 changes: 2 additions & 0 deletions core/line_runereader.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// +build !plan9

package core

import (
Expand Down
41 changes: 0 additions & 41 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import (
_ "github.com/candid82/joker/std/time"
_ "github.com/candid82/joker/std/url"
_ "github.com/candid82/joker/std/yaml"
"github.com/chzyer/readline"
"github.com/pkg/profile"
)

Expand Down Expand Up @@ -227,46 +226,6 @@ func srepl(port string, phase Phase) {
}
}

func repl(phase Phase) {
ProcessReplData()
GLOBAL_ENV.FindNamespace(MakeSymbol("user")).ReferAll(GLOBAL_ENV.FindNamespace(MakeSymbol("joker.repl")))
fmt.Printf("Welcome to joker %s. Use EOF (Ctrl-D) or SIGINT (Ctrl-C) to exit.\n", VERSION)
parseContext := &ParseContext{GlobalEnv: GLOBAL_ENV}
replContext := NewReplContext(parseContext.GlobalEnv)

var runeReader io.RuneReader
var rl *readline.Instance
var err error
if noReadline {
runeReader = bufio.NewReader(Stdin)
} else {
rl, err = readline.New("")
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
defer rl.Close()
runeReader = NewLineRuneReader(rl)
for _, line := range strings.Split(string(dataRead), "\n") {
rl.SaveHistory(line)
}
dataRead = []rune{}
}

reader := NewReader(runeReader, "<repl>")

for {
if noReadline {
print(GLOBAL_ENV.CurrentNamespace().Name.ToString(false) + "=> ")
} else {
rl.SetPrompt(GLOBAL_ENV.CurrentNamespace().Name.ToString(false) + "=> ")
}
if processReplCommand(reader, phase, parseContext, replContext) {
return
}
}
}

func makeDialectKeyword(dialect Dialect) Keyword {
switch dialect {
case EDN:
Expand Down
53 changes: 53 additions & 0 deletions repl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// +build !plan9

package main

import (
"bufio"
"fmt"
"io"
"strings"

. "github.com/candid82/joker/core"
"github.com/chzyer/readline"
)

func repl(phase Phase) {
ProcessReplData()
GLOBAL_ENV.FindNamespace(MakeSymbol("user")).ReferAll(GLOBAL_ENV.FindNamespace(MakeSymbol("joker.repl")))
fmt.Printf("Welcome to joker %s. Use EOF (Ctrl-D) or SIGINT (Ctrl-C) to exit.\n", VERSION)
parseContext := &ParseContext{GlobalEnv: GLOBAL_ENV}
replContext := NewReplContext(parseContext.GlobalEnv)

var runeReader io.RuneReader
var rl *readline.Instance
var err error
if noReadline {
runeReader = bufio.NewReader(Stdin)
} else {
rl, err = readline.New("")
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
defer rl.Close()
runeReader = NewLineRuneReader(rl)
for _, line := range strings.Split(string(dataRead), "\n") {
rl.SaveHistory(line)
}
dataRead = []rune{}
}

reader := NewReader(runeReader, "<repl>")

for {
if noReadline {
print(GLOBAL_ENV.CurrentNamespace().Name.ToString(false) + "=> ")
} else {
rl.SetPrompt(GLOBAL_ENV.CurrentNamespace().Name.ToString(false) + "=> ")
}
if processReplCommand(reader, phase, parseContext, replContext) {
return
}
}
}
28 changes: 28 additions & 0 deletions repl_plan9.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package main

import (
"bufio"
"fmt"
"io"

. "github.com/candid82/joker/core"
)

func repl(phase Phase) {
ProcessReplData()
GLOBAL_ENV.FindNamespace(MakeSymbol("user")).ReferAll(GLOBAL_ENV.FindNamespace(MakeSymbol("joker.repl")))
fmt.Printf("Welcome to joker %s. Use EOF (Ctrl-D) or SIGINT (Ctrl-C) to exit.\n", VERSION)
parseContext := &ParseContext{GlobalEnv: GLOBAL_ENV}
replContext := NewReplContext(parseContext.GlobalEnv)

var runeReader io.RuneReader
runeReader = bufio.NewReader(Stdin)
reader := NewReader(runeReader, "<repl>")

for {
print(GLOBAL_ENV.CurrentNamespace().Name.ToString(false) + "=> ")
if processReplCommand(reader, phase, parseContext, replContext) {
return
}
}
}
51 changes: 0 additions & 51 deletions std/os/os_native.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package os

import (
"bytes"
"io"
"io/ioutil"
"os"
"os/exec"
"strings"
"syscall"

. "github.com/candid82/joker/core"
)
Expand Down Expand Up @@ -97,54 +94,6 @@ func execute(name string, opts Map) Object {
return sh(dir, stdin, stdout, stderr, name, args)
}

func sh(dir string, stdin io.Reader, stdout io.Writer, stderr io.Writer, name string, args []string) Object {
cmd := exec.Command(name, args...)
cmd.Dir = dir
cmd.Stdin = stdin

var stdoutBuffer, stderrBuffer bytes.Buffer
if stdout != nil {
cmd.Stdout = stdout
} else {
cmd.Stdout = &stdoutBuffer
}
if stderr != nil {
cmd.Stderr = stderr
} else {
cmd.Stderr = &stderrBuffer
}

err := cmd.Start()
PanicOnErr(err)

err = cmd.Wait()

res := EmptyArrayMap()
res.Add(MakeKeyword("success"), Boolean{B: err == nil})

var exitCode int
if err != nil {
res.Add(MakeKeyword("err-msg"), String{S: err.Error()})
if exiterr, ok := err.(*exec.ExitError); ok {
ws := exiterr.Sys().(syscall.WaitStatus)
exitCode = ws.ExitStatus()
} else {
exitCode = defaultFailedCode
}
} else {
ws := cmd.ProcessState.Sys().(syscall.WaitStatus)
exitCode = ws.ExitStatus()
}
res.Add(MakeKeyword("exit"), Int{I: exitCode})
if stdout == nil {
res.Add(MakeKeyword("out"), String{S: string(stdoutBuffer.Bytes())})
}
if stderr == nil {
res.Add(MakeKeyword("err"), String{S: string(stderrBuffer.Bytes())})
}
return res
}

func mkdir(name string, perm int) Object {
err := os.Mkdir(name, os.FileMode(perm))
PanicOnErr(err)
Expand Down
60 changes: 60 additions & 0 deletions std/os/sh.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// +build !plan9

package os

import (
"bytes"
"io"
"os/exec"
"syscall"

. "github.com/candid82/joker/core"
)

func sh(dir string, stdin io.Reader, stdout io.Writer, stderr io.Writer, name string, args []string) Object {
cmd := exec.Command(name, args...)
cmd.Dir = dir
cmd.Stdin = stdin

var stdoutBuffer, stderrBuffer bytes.Buffer
if stdout != nil {
cmd.Stdout = stdout
} else {
cmd.Stdout = &stdoutBuffer
}
if stderr != nil {
cmd.Stderr = stderr
} else {
cmd.Stderr = &stderrBuffer
}

err := cmd.Start()
PanicOnErr(err)

err = cmd.Wait()

res := EmptyArrayMap()
res.Add(MakeKeyword("success"), Boolean{B: err == nil})

var exitCode int
if err != nil {
res.Add(MakeKeyword("err-msg"), String{S: err.Error()})
if exiterr, ok := err.(*exec.ExitError); ok {
ws := exiterr.Sys().(syscall.WaitStatus)
exitCode = ws.ExitStatus()
} else {
exitCode = defaultFailedCode
}
} else {
ws := cmd.ProcessState.Sys().(syscall.WaitStatus)
exitCode = ws.ExitStatus()
}
res.Add(MakeKeyword("exit"), Int{I: exitCode})
if stdout == nil {
res.Add(MakeKeyword("out"), String{S: string(stdoutBuffer.Bytes())})
}
if stderr == nil {
res.Add(MakeKeyword("err"), String{S: string(stderrBuffer.Bytes())})
}
return res
}
51 changes: 51 additions & 0 deletions std/os/sh_plan9.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package os

import (
"bytes"
"io"
"os/exec"

. "github.com/candid82/joker/core"
)

func sh(dir string, stdin io.Reader, stdout io.Writer, stderr io.Writer, name string, args []string) Object {
cmd := exec.Command(name, args...)
cmd.Dir = dir
cmd.Stdin = stdin

var stdoutBuffer, stderrBuffer bytes.Buffer
if stdout != nil {
cmd.Stdout = stdout
} else {
cmd.Stdout = &stdoutBuffer
}
if stderr != nil {
cmd.Stderr = stderr
} else {
cmd.Stderr = &stderrBuffer
}

err := cmd.Start()
PanicOnErr(err)

err = cmd.Wait()

res := EmptyArrayMap()
res.Add(MakeKeyword("success"), Boolean{B: err == nil})

var exitCode int
if err != nil {
res.Add(MakeKeyword("err-msg"), String{S: err.Error()})
exitCode = defaultFailedCode
} else {
exitCode = 0
}
res.Add(MakeKeyword("exit"), Int{I: exitCode})
if stdout == nil {
res.Add(MakeKeyword("out"), String{S: string(stdoutBuffer.Bytes())})
}
if stderr == nil {
res.Add(MakeKeyword("err"), String{S: string(stderrBuffer.Bytes())})
}
return res
}

0 comments on commit 036701d

Please sign in to comment.