Example #1
0
func Gen(lib, outDir string, includes []string) {
	generator := &Generator{
		Lib:    lib,
		OutDir: outDir,
	}
	filePrefix := strings.ToLower(lib) + "_"

	// open girepository
	repo := C.g_irepository_get_default()
	var gerr *C.GError
	C.g_irepository_require(repo, toGStr(lib), nil, 0, &gerr)
	if gerr != nil {
		log.Fatal(fromGStr(gerr.message))
	}
	generator.CPrefix = fromGStr(C.g_irepository_get_c_prefix(repo, toGStr(lib)))

	// functions output file
	funcsWriter := new(bytes.Buffer)
	generator.FuncsWriter = funcsWriter
	w(funcsWriter, "package %s\n", strings.ToLower(lib))
	for _, include := range includes {
		w(funcsWriter, "//#include <%s>\n", include)
	}
	w(funcsWriter, "import \"C\"\n")
	defer func() {
		out, err := os.Create(filepath.Join(outDir, filePrefix+"functions.go"))
		if err != nil {
			log.Fatal(err)
		}
		src, err := format.Source(funcsWriter.Bytes())
		if err != nil {
			p("%s\n", funcsWriter.Bytes())
			out.Write(funcsWriter.Bytes())
			out.Close()
			log.Fatal(err)
		}
		out.Write(src)
		out.Close()
	}()

	// iterate infos
	nInfos := C.g_irepository_get_n_infos(repo, toGStr(lib))
	for i := C.gint(0); i < nInfos; i++ {
		baseInfo := C.g_irepository_get_info(repo, toGStr(lib), i)
		t := C.g_base_info_get_type(baseInfo)
		switch t {

		// function
		case C.GI_INFO_TYPE_FUNCTION:
			info := asFunctionInfo(baseInfo)
			generator.GenFunction(info)
		}
	}
}
Example #2
0
func GetCPrefix(namespace string) string {
	prefix, ok := prefixes[namespace]
	if ok {
		return prefix
	}
	ns := GlibString(namespace)
	defer FreeString(ns)
	prefix = GoString(C.g_irepository_get_c_prefix(nil, ns))
	prefixes[namespace] = prefix
	return prefix
}
Example #3
0
// g_irepository_get_c_prefix
func (r *Repository) CPrefix(namespace string) string {
	gnamespace := _GoStringToGString(namespace)
	prefix := C.g_irepository_get_c_prefix(r.c, gnamespace)
	C.free_gstring(gnamespace)
	return _GStringToGoString(prefix)
}