aboutsummaryrefslogtreecommitdiff
path: root/exec.go
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-04-13 20:08:38 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-04-13 20:08:38 +0900
commitee8b33c24a07ed3ba09dabbe6b9be359ee3ba307 (patch)
tree040987d25b7c59323f9041cb3f90ea0a051c5acb /exec.go
parenta622c5e24119d40da17e3f384419dad7122c42ca (diff)
downloadkati-ee8b33c24a07ed3ba09dabbe6b9be359ee3ba307.tar.gz
Implement automatic variables with suffixes
Diffstat (limited to 'exec.go')
-rw-r--r--exec.go47
1 files changed, 43 insertions, 4 deletions
diff --git a/exec.go b/exec.go
index 4ded636..6db0acb 100644
--- a/exec.go
+++ b/exec.go
@@ -1,6 +1,7 @@
package main
import (
+ "bytes"
"fmt"
"io"
"os"
@@ -71,6 +72,38 @@ func (v AutoPlusVar) Eval(w io.Writer, ev *Evaluator) {
fmt.Fprint(w, strings.Join(v.ex.currentInputs, " "))
}
+type AutoSuffixDVar struct {
+ AutoVar
+ v Var
+}
+
+func (v AutoSuffixDVar) Eval(w io.Writer, ev *Evaluator) {
+ var buf bytes.Buffer
+ v.v.Eval(&buf, ev)
+ for i, tok := range splitSpaces(buf.String()) {
+ if i > 0 {
+ w.Write([]byte{' '})
+ }
+ fmt.Fprint(w, filepath.Dir(tok))
+ }
+}
+
+type AutoSuffixFVar struct {
+ AutoVar
+ v Var
+}
+
+func (v AutoSuffixFVar) Eval(w io.Writer, ev *Evaluator) {
+ var buf bytes.Buffer
+ v.v.Eval(&buf, ev)
+ for i, tok := range splitSpaces(buf.String()) {
+ if i > 0 {
+ w.Write([]byte{' '})
+ }
+ fmt.Fprint(w, filepath.Base(tok))
+ }
+}
+
func newExecutor(vars Vars) *Executor {
ex := &Executor{
rules: make(map[string]*Rule),
@@ -79,10 +112,16 @@ func newExecutor(vars Vars) *Executor {
vars: vars,
}
- ex.vars["@"] = AutoAtVar{AutoVar: AutoVar{ex: ex}}
- ex.vars["<"] = AutoLessVar{AutoVar: AutoVar{ex: ex}}
- ex.vars["^"] = AutoHatVar{AutoVar: AutoVar{ex: ex}}
- ex.vars["+"] = AutoPlusVar{AutoVar: AutoVar{ex: ex}}
+ for k, v := range map[string]Var{
+ "@": AutoAtVar{AutoVar: AutoVar{ex: ex}},
+ "<": AutoLessVar{AutoVar: AutoVar{ex: ex}},
+ "^": AutoHatVar{AutoVar: AutoVar{ex: ex}},
+ "+": AutoPlusVar{AutoVar: AutoVar{ex: ex}},
+ } {
+ ex.vars[k] = v
+ ex.vars[k+"D"] = AutoSuffixDVar{v: v}
+ ex.vars[k+"F"] = AutoSuffixFVar{v: v}
+ }
return ex
}