File: func.go

package info (click to toggle)
golang-github-wellington-go-libsass 0.9.2%2Bgit20181130.4ef5b9d-1.1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 2,128 kB
  • sloc: cpp: 28,607; ansic: 839; makefile: 44
file content (66 lines) | stat: -rw-r--r-- 1,618 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package libs

// #include <stdlib.h>
// #include "sass/context.h"
//
// extern union Sass_Value* GoBridge( union Sass_Value* s_args, int idx);
//
// union Sass_Value* CallSassFunction( union Sass_Value* s_args, Sass_Function_Entry cb, struct Sass_Options* opts ) {
//     void* cookie = sass_function_get_cookie(cb);
//     union Sass_Value* ret;
//     int idx = *((int *)cookie);
//     ret = GoBridge(s_args, idx);
//     return ret;
// }
//
import "C"
import "unsafe"

type SassFunc C.Sass_Function_Entry

// SassMakeFunction binds a Go pointer to a Sass function signature
func SassMakeFunction(signature string, idx *int) SassFunc {
	csign := C.CString(signature)
	ptr := unsafe.Pointer(idx)
	fn := C.sass_make_function(
		csign,
		C.Sass_Function_Fn(C.CallSassFunction),
		ptr)

	return (SassFunc)(fn)
}

var globalFuncs SafeMap

func init() {
	globalFuncs.init()
}

// BindFuncs attaches a slice of Functions to a sass options. Signatures
// are already defined in the SassFunc.
func BindFuncs(opts SassOptions, cookies []Cookie) []int {

	funcs := make([]SassFunc, len(cookies))
	ids := make([]int, len(cookies))
	for i, cookie := range cookies {
		idx := globalFuncs.Set(cookies[i])
		fn := SassMakeFunction(cookie.Sign, idx)
		funcs[i] = fn
		ids[i] = *idx
	}

	sz := C.size_t(len(funcs))
	cfuncs := C.sass_make_function_list(sz)
	for i, cfn := range funcs {
		C.sass_function_set_list_entry(cfuncs, C.size_t(i), C.Sass_Function_Entry(cfn))
	}
	C.sass_option_set_c_functions(opts, cfuncs)
	return ids
}

func RemoveFuncs(ids []int) error {
	for _, idx := range ids {
		globalFuncs.Del(idx)
	}
	return nil
}