github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/processes/bgfg.go (about) 1 package processes 2 3 import ( 4 "github.com/lmorg/murex/lang" 5 "github.com/lmorg/murex/lang/types" 6 ) 7 8 func init() { 9 lang.DefineFunction("bg", cmdBackground, types.Null) 10 lang.DefineFunction("fg", cmdForeground, types.Null) 11 } 12 13 func cmdBackground(p *lang.Process) (err error) { 14 p.Stdout.SetDataType(types.Null) 15 16 var block []rune 17 18 if p.IsMethod { 19 b, err := p.Stdin.ReadAll() 20 if err != nil { 21 return err 22 } 23 block = []rune(string(b)) 24 25 } else { 26 block, err = p.Parameters.Block(0) 27 if err != nil { 28 return mkbg(p) 29 } 30 } 31 32 p.Background.Set(true) 33 p.WaitForTermination <- false 34 fork := p.Fork(lang.F_FUNCTION | lang.F_BACKGROUND) 35 fork.Name.Set(p.Name.String()) 36 fork.Parameters.CopyFrom(&p.Parameters) 37 go fork.Execute(block) 38 39 return nil 40 } 41 42 func updateTree(p *lang.Process, isBackground bool) { 43 pTree := p 44 for { 45 //if pTree.Parent == nil || pTree.Parent.Id == 0 || pTree.Name.String() == `bg` { 46 if pTree.Id == 0 || pTree.Name.String() == `bg` { 47 break 48 } 49 pTree = pTree.Parent 50 pTree.Background.Set(isBackground) 51 } 52 53 pTree = p 54 for { 55 //if pTree.Next == nil || pTree.Next.Id == p.Parent.Id { 56 if pTree.Next.Id == p.Parent.Id { 57 pTree.Background.Set(isBackground) 58 break 59 } 60 pTree = pTree.Next 61 pTree.Background.Set(isBackground) 62 } 63 }