modernc.org/99c@v1.0.1-0.20181109153923-a9e8197063d9/examples/ffi/main.go (about) 1 //go:generate 99c -99lib -o assets/a.out lib42.c 2 //go:generate assets 3 4 package main 5 6 import ( 7 "fmt" 8 "time" 9 10 "modernc.org/httpfs" 11 "modernc.org/ir" 12 "modernc.org/virtual" 13 "modernc.org/xc" 14 ) 15 16 func main() { 17 fs := httpfs.NewFileSystem(assets, time.Now()) 18 f, err := fs.Open("/a.out") 19 if err != nil { 20 panic(err) 21 } 22 23 var bin virtual.Binary 24 if _, err := bin.ReadFrom(f); err != nil { 25 panic(err) 26 } 27 28 m, _, err := virtual.New(&bin, nil, nil, nil, nil, 0, 1<<10, "") 29 if err != nil { 30 panic(err) 31 } 32 33 defer m.Close() 34 35 pc, ok := bin.Sym[ir.NameID(xc.Dict.SID("f42"))] 36 if !ok { 37 panic("symbol not found") 38 } 39 40 t, err := m.NewThread(1 << 10) 41 if err != nil { 42 panic(err) 43 } 44 45 for _, v := range []int{-1, 0, 1} { 46 var y int32 47 _, err := t.FFI1(pc, virtual.Int32Result{&y}, virtual.Int32(int32(v))) 48 if err != nil { 49 panic(err) 50 } 51 52 fmt.Println(y) 53 } 54 }