-
Notifications
You must be signed in to change notification settings - Fork 1
/
context.go
157 lines (135 loc) · 3.51 KB
/
context.go
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package ocio
// #include "stdlib.h"
//
// #include "ocio.h"
//
import "C"
import (
"runtime"
"unsafe"
)
type Context struct {
ptr C.ContextId
}
func newContext(p C.ContextId) *Context {
cfg := &Context{p}
runtime.SetFinalizer(cfg, deleteContext)
return cfg
}
func deleteContext(c *Context) {
if c == nil {
return
}
if c.ptr != nil {
runtime.SetFinalizer(c, nil)
C.deleteContext(c.ptr)
c.ptr = nil
}
runtime.KeepAlive(c)
}
// Create a new empty Context
func NewContext() *Context {
return newContext(C.Context_Create())
}
func (c *Context) lastError(errno ...error) error {
if c == nil {
return nil
}
err := getLastError(c.ptr, errno...)
runtime.KeepAlive(c)
return err
}
// Destroy immediately frees resources for this
// instance instead of waiting for garbage collection
// finalizer to run at some point later
func (c *Context) Destroy() {
deleteContext(c)
}
// Create a new editable copy of this Context
func (c *Context) EditableCopy() *Context {
ret := newContext(C.Context_createEditableCopy(c.ptr))
runtime.KeepAlive(c)
return ret
}
func (c *Context) CacheID() (string, error) {
id, err := C.Context_getCacheID(c.ptr)
if err = c.lastError(err); err != nil {
return "", err
}
runtime.KeepAlive(c)
return C.GoString(id), nil
}
func (c *Context) SetSearchPath(path string) {
c_str := C.CString(path)
defer C.free(unsafe.Pointer(c_str))
C.Context_setSearchPath(c.ptr, c_str)
runtime.KeepAlive(c)
}
func (c *Context) SearchPath() string {
ret := C.GoString(C.Context_getSearchPath(c.ptr))
runtime.KeepAlive(c)
return ret
}
func (c *Context) SetWorkingDir(dirname string) {
c_str := C.CString(dirname)
defer C.free(unsafe.Pointer(c_str))
C.Context_setWorkingDir(c.ptr, c_str)
runtime.KeepAlive(c)
}
func (c *Context) WorkingDir() string {
ret := C.GoString(C.Context_getWorkingDir(c.ptr))
runtime.KeepAlive(c)
return ret
}
func (c *Context) SetStringVar(name, value string) {
c_name := C.CString(name)
c_val := C.CString(value)
defer C.free(unsafe.Pointer(c_name))
defer C.free(unsafe.Pointer(c_val))
C.Context_setStringVar(c.ptr, c_name, c_val)
runtime.KeepAlive(c)
}
func (c *Context) StringVar(name string) string {
c_name := C.CString(name)
defer C.free(unsafe.Pointer(c_name))
ret := C.GoString(C.Context_getStringVar(c.ptr, c_name))
runtime.KeepAlive(c)
return ret
}
func (c *Context) EnvironmentMode() EnvironmentMode {
ret := C.Context_getEnvironmentMode(c.ptr)
runtime.KeepAlive(c)
return EnvironmentMode(ret)
}
func (c *Context) SetEnvironmentMode(mode EnvironmentMode) {
C.Context_setEnvironmentMode(c.ptr, C.EnvironmentMode(mode))
runtime.KeepAlive(c)
}
// Seed all string vars with the current environment.
func (c *Context) LoadEnvironment() {
C.Context_loadEnvironment(c.ptr)
runtime.KeepAlive(c)
}
// Do a file lookup.
// Evaluate the specified variable (as needed).
func (c *Context) ResolveStringVar(val string) string {
c_name := C.CString(val)
defer C.free(unsafe.Pointer(c_name))
ret := C.GoString(C.Context_resolveStringVar(c.ptr, c_name))
runtime.KeepAlive(c)
return ret
}
// Do a file lookup.
// Evaluate all variables (as needed). Also, walk the full search
// path until the file is found.
// If the filename cannot be found, an error will be returned.
func (c *Context) ResolveFileLocation(filename string) (string, error) {
c_name := C.CString(filename)
defer C.free(unsafe.Pointer(c_name))
val, err := C.Context_resolveFileLocation(c.ptr, c_name)
if err = c.lastError(err); err != nil {
return "", err
}
runtime.KeepAlive(c)
return C.GoString(val), nil
}