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  }