aboutsummaryrefslogtreecommitdiff
path: root/func.go
diff options
context:
space:
mode:
authorFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-07-07 14:19:32 +0900
committerFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-07-07 15:21:46 +0900
commitb44b12d1f8db50517bdbb949516d84375f578d47 (patch)
treedbb466b1d818bdd11326b70da419c06f21e4d27f /func.go
parentc8b4b1c1ecba85933c16b74052e23106bf5581f2 (diff)
downloadkati-b44b12d1f8db50517bdbb949516d84375f578d47.tar.gz
introduce evalWriter
merge ssvWriter into buffer
Diffstat (limited to 'func.go')
-rw-r--r--func.go138
1 files changed, 64 insertions, 74 deletions
diff --git a/func.go b/func.go
index 89fdbe2..d390409 100644
--- a/func.go
+++ b/func.go
@@ -167,7 +167,7 @@ func (c *fclosure) dump(d *dumpbuf) {
type funcSubst struct{ fclosure }
func (f *funcSubst) Arity() int { return 3 }
-func (f *funcSubst) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcSubst) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("subst", 3, len(f.args))
if err != nil {
return err
@@ -191,7 +191,7 @@ func (f *funcSubst) Eval(w io.Writer, ev *Evaluator) error {
type funcPatsubst struct{ fclosure }
func (f *funcPatsubst) Arity() int { return 3 }
-func (f *funcPatsubst) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcPatsubst) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("patsubst", 3, len(f.args))
if err != nil {
return err
@@ -226,7 +226,7 @@ func (f *funcPatsubst) Eval(w io.Writer, ev *Evaluator) error {
type funcStrip struct{ fclosure }
func (f *funcStrip) Arity() int { return 1 }
-func (f *funcStrip) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcStrip) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("strip", 1, len(f.args))
if err != nil {
return err
@@ -254,7 +254,7 @@ func (f *funcStrip) Eval(w io.Writer, ev *Evaluator) error {
type funcFindstring struct{ fclosure }
func (f *funcFindstring) Arity() int { return 2 }
-func (f *funcFindstring) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcFindstring) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("findstring", 2, len(f.args))
if err != nil {
return err
@@ -278,7 +278,7 @@ func (f *funcFindstring) Eval(w io.Writer, ev *Evaluator) error {
type funcFilter struct{ fclosure }
func (f *funcFilter) Arity() int { return 2 }
-func (f *funcFilter) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcFilter) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("filter", 2, len(f.args))
if err != nil {
return err
@@ -295,12 +295,11 @@ func (f *funcFilter) Eval(w io.Writer, ev *Evaluator) error {
patterns = append(patterns, ws.Bytes())
}
ws = newWordScanner(fargs[1])
- sw := ssvWriter{w: w}
for ws.Scan() {
text := ws.Bytes()
for _, pat := range patterns {
if matchPatternBytes(pat, text) {
- sw.Write(text)
+ w.writeWord(text)
}
}
}
@@ -312,7 +311,7 @@ func (f *funcFilter) Eval(w io.Writer, ev *Evaluator) error {
type funcFilterOut struct{ fclosure }
func (f *funcFilterOut) Arity() int { return 2 }
-func (f *funcFilterOut) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcFilterOut) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("filter-out", 2, len(f.args))
if err != nil {
return err
@@ -329,7 +328,6 @@ func (f *funcFilterOut) Eval(w io.Writer, ev *Evaluator) error {
patterns = append(patterns, ws.Bytes())
}
ws = newWordScanner(fargs[1])
- sw := ssvWriter{w: w}
Loop:
for ws.Scan() {
text := ws.Bytes()
@@ -338,7 +336,7 @@ Loop:
continue Loop
}
}
- sw.Write(text)
+ w.writeWord(text)
}
freeBuf(abuf)
stats.add("funcbody", "filter-out", t)
@@ -348,7 +346,7 @@ Loop:
type funcSort struct{ fclosure }
func (f *funcSort) Arity() int { return 1 }
-func (f *funcSort) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcSort) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("sort", 1, len(f.args))
if err != nil {
return err
@@ -386,7 +384,7 @@ func (f *funcSort) Eval(w io.Writer, ev *Evaluator) error {
type funcWord struct{ fclosure }
func (f *funcWord) Arity() int { return 2 }
-func (f *funcWord) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcWord) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("word", 2, len(f.args))
if err != nil {
return err
@@ -421,7 +419,7 @@ func (f *funcWord) Eval(w io.Writer, ev *Evaluator) error {
type funcWordlist struct{ fclosure }
func (f *funcWordlist) Arity() int { return 3 }
-func (f *funcWordlist) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcWordlist) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("wordlist", 3, len(f.args))
if err != nil {
return err
@@ -448,11 +446,10 @@ func (f *funcWordlist) Eval(w io.Writer, ev *Evaluator) error {
ws := newWordScanner(fargs[2])
i := 0
- sw := ssvWriter{w: w}
for ws.Scan() {
i++
if si <= i && i <= ei {
- sw.Write(ws.Bytes())
+ w.writeWord(ws.Bytes())
}
}
freeBuf(abuf)
@@ -463,7 +460,7 @@ func (f *funcWordlist) Eval(w io.Writer, ev *Evaluator) error {
type funcWords struct{ fclosure }
func (f *funcWords) Arity() int { return 1 }
-func (f *funcWords) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcWords) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("words", 1, len(f.args))
if err != nil {
return err
@@ -488,7 +485,7 @@ func (f *funcWords) Eval(w io.Writer, ev *Evaluator) error {
type funcFirstword struct{ fclosure }
func (f *funcFirstword) Arity() int { return 1 }
-func (f *funcFirstword) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcFirstword) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("firstword", 1, len(f.args))
if err != nil {
return err
@@ -511,7 +508,7 @@ func (f *funcFirstword) Eval(w io.Writer, ev *Evaluator) error {
type funcLastword struct{ fclosure }
func (f *funcLastword) Arity() int { return 1 }
-func (f *funcLastword) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcLastword) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("lastword", 1, len(f.args))
if err != nil {
return err
@@ -540,7 +537,7 @@ func (f *funcLastword) Eval(w io.Writer, ev *Evaluator) error {
type funcJoin struct{ fclosure }
func (f *funcJoin) Arity() int { return 2 }
-func (f *funcJoin) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcJoin) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("join", 2, len(f.args))
if err != nil {
return err
@@ -553,14 +550,14 @@ func (f *funcJoin) Eval(w io.Writer, ev *Evaluator) error {
t := time.Now()
ws1 := newWordScanner(fargs[0])
ws2 := newWordScanner(fargs[1])
- sw := ssvWriter{w: w}
for {
if w1, w2 := ws1.Scan(), ws2.Scan(); !w1 && !w2 {
break
}
- sw.Write(ws1.Bytes())
- // Use |w| not to append extra ' '.
- w.Write(ws2.Bytes())
+ var word []byte
+ word = append(word, ws1.Bytes()...)
+ word = append(word, ws2.Bytes()...)
+ w.writeWord(word)
}
freeBuf(abuf)
stats.add("funcbody", "join", t)
@@ -570,7 +567,7 @@ func (f *funcJoin) Eval(w io.Writer, ev *Evaluator) error {
type funcWildcard struct{ fclosure }
func (f *funcWildcard) Arity() int { return 1 }
-func (f *funcWildcard) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcWildcard) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("wildcard", 1, len(f.args))
if err != nil {
return err
@@ -592,10 +589,9 @@ func (f *funcWildcard) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
pat := string(ws.Bytes())
- err = wildcard(&sw, pat)
+ err = wildcard(w, pat)
if err != nil {
return err
}
@@ -609,7 +605,7 @@ func (f *funcWildcard) Eval(w io.Writer, ev *Evaluator) error {
type funcDir struct{ fclosure }
func (f *funcDir) Arity() int { return 1 }
-func (f *funcDir) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcDir) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("dir", 1, len(f.args))
if err != nil {
return err
@@ -621,14 +617,13 @@ func (f *funcDir) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
name := filepath.Dir(string(string(ws.Bytes())))
if name == "/" {
- sw.WriteString(name)
+ w.writeWordString(name)
continue
}
- sw.WriteString(name + string(filepath.Separator))
+ w.writeWordString(name + string(filepath.Separator))
}
freeBuf(abuf)
stats.add("funcbody", "dir", t)
@@ -638,7 +633,7 @@ func (f *funcDir) Eval(w io.Writer, ev *Evaluator) error {
type funcNotdir struct{ fclosure }
func (f *funcNotdir) Arity() int { return 1 }
-func (f *funcNotdir) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcNotdir) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("notdir", 1, len(f.args))
if err != nil {
return err
@@ -650,14 +645,13 @@ func (f *funcNotdir) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
name := string(ws.Bytes())
if name == string(filepath.Separator) {
- sw.Write([]byte{}) // separator
+ w.writeWord([]byte{}) // separator
continue
}
- sw.WriteString(filepath.Base(name))
+ w.writeWordString(filepath.Base(name))
}
freeBuf(abuf)
stats.add("funcbody", "notdir", t)
@@ -667,7 +661,7 @@ func (f *funcNotdir) Eval(w io.Writer, ev *Evaluator) error {
type funcSuffix struct{ fclosure }
func (f *funcSuffix) Arity() int { return 1 }
-func (f *funcSuffix) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcSuffix) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("suffix", 1, len(f.args))
if err != nil {
return err
@@ -679,12 +673,11 @@ func (f *funcSuffix) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
tok := string(ws.Bytes())
e := filepath.Ext(tok)
if len(e) > 0 {
- sw.WriteString(e)
+ w.writeWordString(e)
}
}
freeBuf(abuf)
@@ -695,7 +688,7 @@ func (f *funcSuffix) Eval(w io.Writer, ev *Evaluator) error {
type funcBasename struct{ fclosure }
func (f *funcBasename) Arity() int { return 1 }
-func (f *funcBasename) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcBasename) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("basename", 1, len(f.args))
if err != nil {
return err
@@ -707,11 +700,10 @@ func (f *funcBasename) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
tok := string(ws.Bytes())
e := stripExt(tok)
- sw.WriteString(e)
+ w.writeWordString(e)
}
freeBuf(abuf)
stats.add("funcbody", "basename", t)
@@ -721,7 +713,7 @@ func (f *funcBasename) Eval(w io.Writer, ev *Evaluator) error {
type funcAddsuffix struct{ fclosure }
func (f *funcAddsuffix) Arity() int { return 2 }
-func (f *funcAddsuffix) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcAddsuffix) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("addsuffix", 2, len(f.args))
if err != nil {
return err
@@ -734,11 +726,11 @@ func (f *funcAddsuffix) Eval(w io.Writer, ev *Evaluator) error {
t := time.Now()
suf := fargs[0]
ws := newWordScanner(fargs[1])
- sw := ssvWriter{w: w}
for ws.Scan() {
- sw.Write(ws.Bytes())
- // Use |w| not to append extra ' '.
- w.Write(suf)
+ var name []byte
+ name = append(name, ws.Bytes()...)
+ name = append(name, suf...)
+ w.writeWord(name)
}
freeBuf(abuf)
stats.add("funcbody", "addsuffix", t)
@@ -748,7 +740,7 @@ func (f *funcAddsuffix) Eval(w io.Writer, ev *Evaluator) error {
type funcAddprefix struct{ fclosure }
func (f *funcAddprefix) Arity() int { return 2 }
-func (f *funcAddprefix) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcAddprefix) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("addprefix", 2, len(f.args))
if err != nil {
return err
@@ -761,11 +753,11 @@ func (f *funcAddprefix) Eval(w io.Writer, ev *Evaluator) error {
t := time.Now()
pre := fargs[0]
ws := newWordScanner(fargs[1])
- sw := ssvWriter{w: w}
for ws.Scan() {
- sw.Write(pre)
- // Use |w| not to append extra ' '.
- w.Write(ws.Bytes())
+ var name []byte
+ name = append(name, pre...)
+ name = append(name, ws.Bytes()...)
+ w.writeWord(name)
}
freeBuf(abuf)
stats.add("funcbody", "addprefix", t)
@@ -775,7 +767,7 @@ func (f *funcAddprefix) Eval(w io.Writer, ev *Evaluator) error {
type funcRealpath struct{ fclosure }
func (f *funcRealpath) Arity() int { return 1 }
-func (f *funcRealpath) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcRealpath) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("realpath", 1, len(f.args))
if err != nil {
return err
@@ -792,7 +784,6 @@ func (f *funcRealpath) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
name := string(ws.Bytes())
name, err := filepath.Abs(name)
@@ -805,7 +796,7 @@ func (f *funcRealpath) Eval(w io.Writer, ev *Evaluator) error {
logf("realpath: %v", err)
continue
}
- sw.WriteString(name)
+ w.writeWordString(name)
}
freeBuf(abuf)
stats.add("funcbody", "realpath", t)
@@ -815,7 +806,7 @@ func (f *funcRealpath) Eval(w io.Writer, ev *Evaluator) error {
type funcAbspath struct{ fclosure }
func (f *funcAbspath) Arity() int { return 1 }
-func (f *funcAbspath) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcAbspath) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("abspath", 1, len(f.args))
if err != nil {
return err
@@ -827,7 +818,6 @@ func (f *funcAbspath) Eval(w io.Writer, ev *Evaluator) error {
}
t := time.Now()
ws := newWordScanner(abuf.Bytes())
- sw := ssvWriter{w: w}
for ws.Scan() {
name := string(ws.Bytes())
name, err := filepath.Abs(name)
@@ -835,7 +825,7 @@ func (f *funcAbspath) Eval(w io.Writer, ev *Evaluator) error {
logf("abs: %v", err)
continue
}
- sw.WriteString(name)
+ w.writeWordString(name)
}
freeBuf(abuf)
stats.add("funcbody", "abspath", t)
@@ -846,7 +836,7 @@ func (f *funcAbspath) Eval(w io.Writer, ev *Evaluator) error {
type funcIf struct{ fclosure }
func (f *funcIf) Arity() int { return 3 }
-func (f *funcIf) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcIf) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("if", 2, len(f.args))
if err != nil {
return err
@@ -870,7 +860,7 @@ func (f *funcIf) Eval(w io.Writer, ev *Evaluator) error {
type funcAnd struct{ fclosure }
func (f *funcAnd) Arity() int { return 0 }
-func (f *funcAnd) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcAnd) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("and", 0, len(f.args))
if err != nil {
return nil
@@ -897,7 +887,7 @@ func (f *funcAnd) Eval(w io.Writer, ev *Evaluator) error {
type funcOr struct{ fclosure }
func (f *funcOr) Arity() int { return 0 }
-func (f *funcOr) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcOr) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("or", 0, len(f.args))
if err != nil {
return err
@@ -942,7 +932,7 @@ func hasNoIoInShellScript(s []byte) bool {
return true
}
-func (f *funcShell) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcShell) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("shell", 1, len(f.args))
if err != nil {
return err
@@ -1019,7 +1009,7 @@ type funcCall struct{ fclosure }
func (f *funcCall) Arity() int { return 0 }
-func (f *funcCall) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcCall) Eval(w evalWriter, ev *Evaluator) error {
abuf := newBuf()
fargs, err := ev.args(abuf, f.args[1:]...)
if err != nil {
@@ -1052,7 +1042,7 @@ func (f *funcCall) Eval(w io.Writer, ev *Evaluator) error {
var buf bytes.Buffer
if LogFlag {
- w = io.MultiWriter(w, &buf)
+ w = &ssvWriter{Writer: io.MultiWriter(w, &buf)}
}
err = v.Eval(w, ev)
if err != nil {
@@ -1071,7 +1061,7 @@ func (f *funcCall) Eval(w io.Writer, ev *Evaluator) error {
type funcValue struct{ fclosure }
func (f *funcValue) Arity() int { return 1 }
-func (f *funcValue) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcValue) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("value", 1, len(f.args))
if err != nil {
return err
@@ -1091,7 +1081,7 @@ func (f *funcValue) Eval(w io.Writer, ev *Evaluator) error {
type funcEval struct{ fclosure }
func (f *funcEval) Arity() int { return 1 }
-func (f *funcEval) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcEval) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("eval", 1, len(f.args))
if err != nil {
return err
@@ -1184,8 +1174,8 @@ func stripComment(arg string) string {
type funcNop struct{ expr string }
-func (f *funcNop) String() string { return f.expr }
-func (f *funcNop) Eval(io.Writer, *Evaluator) error { return nil }
+func (f *funcNop) String() string { return f.expr }
+func (f *funcNop) Eval(evalWriter, *Evaluator) error { return nil }
func (f *funcNop) serialize() serializableVar {
return serializableVar{
Type: "funcNop",
@@ -1228,8 +1218,8 @@ func (f *funcEvalAssign) String() string {
return fmt.Sprintf("$(eval %s %s %s)", f.lhs, f.op, f.rhs)
}
-func (f *funcEvalAssign) Eval(w io.Writer, ev *Evaluator) error {
- var abuf bytes.Buffer
+func (f *funcEvalAssign) Eval(w evalWriter, ev *Evaluator) error {
+ var abuf buffer
err := f.rhs.Eval(&abuf, ev)
if err != nil {
return err
@@ -1299,7 +1289,7 @@ func (f *funcEvalAssign) dump(d *dumpbuf) {
type funcOrigin struct{ fclosure }
func (f *funcOrigin) Arity() int { return 1 }
-func (f *funcOrigin) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcOrigin) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("origin", 1, len(f.args))
if err != nil {
return err
@@ -1319,7 +1309,7 @@ func (f *funcOrigin) Eval(w io.Writer, ev *Evaluator) error {
type funcFlavor struct{ fclosure }
func (f *funcFlavor) Arity() int { return 1 }
-func (f *funcFlavor) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcFlavor) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("flavor", 1, len(f.args))
if err != nil {
return err
@@ -1339,7 +1329,7 @@ func (f *funcFlavor) Eval(w io.Writer, ev *Evaluator) error {
type funcInfo struct{ fclosure }
func (f *funcInfo) Arity() int { return 1 }
-func (f *funcInfo) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcInfo) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("info", 1, len(f.args))
if err != nil {
return err
@@ -1362,7 +1352,7 @@ func (f *funcInfo) Eval(w io.Writer, ev *Evaluator) error {
type funcWarning struct{ fclosure }
func (f *funcWarning) Arity() int { return 1 }
-func (f *funcWarning) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcWarning) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("warning", 1, len(f.args))
if err != nil {
return err
@@ -1385,7 +1375,7 @@ func (f *funcWarning) Eval(w io.Writer, ev *Evaluator) error {
type funcError struct{ fclosure }
func (f *funcError) Arity() int { return 1 }
-func (f *funcError) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcError) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("error", 1, len(f.args))
if err != nil {
return err
@@ -1408,7 +1398,7 @@ type funcForeach struct{ fclosure }
func (f *funcForeach) Arity() int { return 3 }
-func (f *funcForeach) Eval(w io.Writer, ev *Evaluator) error {
+func (f *funcForeach) Eval(w evalWriter, ev *Evaluator) error {
err := assertArity("foreach", 3, len(f.args))
if err != nil {
return err