userland: add archive tools and pinned GoAWK, esbuild, and QuickJS
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
// Don't run these on Windows, because newline handling means they don't pass.
|
||||
|
||||
//go:build !windows
|
||||
|
||||
package interp_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/benhoyt/goawk/interp"
|
||||
"github.com/benhoyt/goawk/parser"
|
||||
)
|
||||
|
||||
func Example() {
|
||||
input := strings.NewReader("foo bar\n\nbaz buz")
|
||||
err := interp.Exec("$0 { print $1 }", " ", input, nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
// Output:
|
||||
// foo
|
||||
// baz
|
||||
}
|
||||
|
||||
func Example_fieldsep() {
|
||||
// Use ',' as the field separator
|
||||
input := strings.NewReader("1,2\n3,4")
|
||||
err := interp.Exec("{ print $1, $2 }", ",", input, nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
// Output:
|
||||
// 1 2
|
||||
// 3 4
|
||||
}
|
||||
|
||||
func Example_program() {
|
||||
src := "{ print NR, tolower($0) }"
|
||||
input := "A\naB\nAbC"
|
||||
|
||||
prog, err := parser.ParseProgram([]byte(src), nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
config := &interp.Config{
|
||||
Stdin: strings.NewReader(input),
|
||||
Vars: []string{"OFS", ":"},
|
||||
}
|
||||
_, err = interp.ExecProgram(prog, config)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
// Output:
|
||||
// 1:a
|
||||
// 2:ab
|
||||
// 3:abc
|
||||
}
|
||||
|
||||
func Example_funcs() {
|
||||
src := `BEGIN { print sum(), sum(1), sum(2, 3, 4), repeat("xyz", 3) }`
|
||||
|
||||
parserConfig := &parser.ParserConfig{
|
||||
Funcs: map[string]any{
|
||||
"sum": func(args ...float64) float64 {
|
||||
sum := 0.0
|
||||
for _, a := range args {
|
||||
sum += a
|
||||
}
|
||||
return sum
|
||||
},
|
||||
"repeat": strings.Repeat,
|
||||
},
|
||||
}
|
||||
prog, err := parser.ParseProgram([]byte(src), parserConfig)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
interpConfig := &interp.Config{
|
||||
Funcs: parserConfig.Funcs,
|
||||
}
|
||||
_, err = interp.ExecProgram(prog, interpConfig)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
// Output:
|
||||
// 0 1 9 xyzxyzxyz
|
||||
}
|
||||
|
||||
func Example_new() {
|
||||
// We'll execute this program multiple times on different inputs.
|
||||
src := `{ print $1, x, $3; x++ }`
|
||||
|
||||
// Parse the program and set up the interpreter.
|
||||
prog, err := parser.ParseProgram([]byte(src), nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
interpreter, err := interp.New(prog)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Run it once on one input.
|
||||
_, err = interpreter.Execute(&interp.Config{
|
||||
Stdin: strings.NewReader("one two three"),
|
||||
Environ: []string{}, // avoid calling os.Environ each time
|
||||
})
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Reset variables and run it again efficiently on a different input (this
|
||||
// could be from a completely different data source).
|
||||
interpreter.ResetVars()
|
||||
_, err = interpreter.Execute(&interp.Config{
|
||||
Stdin: strings.NewReader("a b c\nd e f\n"),
|
||||
Environ: []string{},
|
||||
})
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Run it on another input, this time without resetting variables.
|
||||
_, err = interpreter.Execute(&interp.Config{
|
||||
Stdin: strings.NewReader("x y z"),
|
||||
Environ: []string{},
|
||||
})
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
// Output:
|
||||
// one three
|
||||
// a c
|
||||
// d 1 f
|
||||
// x 2 z
|
||||
}
|
||||
|
||||
func Example_csv() {
|
||||
src := `{ total += @"amount" } END { print total }`
|
||||
input := `# comment
|
||||
name,amount
|
||||
Bob,17.50
|
||||
Jill,20
|
||||
"Boba Fett",100.00
|
||||
`
|
||||
prog, err := parser.ParseProgram([]byte(src), nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
config := &interp.Config{
|
||||
Stdin: strings.NewReader(input),
|
||||
InputMode: interp.CSVMode,
|
||||
CSVInput: interp.CSVInputConfig{Comment: '#', Header: true},
|
||||
}
|
||||
_, err = interp.ExecProgram(prog, config)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
// Output:
|
||||
// 137.5
|
||||
}
|
||||
Reference in New Issue
Block a user