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  }