6 #if defined(MODULE_EMBED)
11 #if defined(WITH_SQUIRREL)
16 #define _RPMSQUIRREL_INTERNAL
27 #if defined(WITH_SQUIRREL)
28 static int dlopened = 0;
29 static rpmsquirrel (*rpmsquirrelNew_p) (
char ** av, uint32_t flags);
30 static rpmRC (*rpmsquirrelRunFile_p) (
rpmsquirrel squirrel,
const char * fn,
const char ** resultp);
31 static rpmRC (*rpmsquirrelRun_p) (
rpmsquirrel squirrel,
const char * str,
const char ** resultp);
40 #if defined(MODULE_EMBED)
41 sq_close((HSQUIRRELVM)squirrel->I);
57 if (_rpmsquirrelPool == NULL) {
65 #if defined(MODULE_EMBED)
66 static void rpmsquirrelPrint(HSQUIRRELVM v,
const SQChar *s, ...)
76 if (nw > -1 && (
size_t)nw < nb)
101 #if defined(WITH_SQUIRREL)
102 static void loadModule(
void) {
103 const char librpmsquirrel[] =
"rpmsquirrel.so";
106 h = dlopen (librpmsquirrel, RTLD_NOW|RTLD_GLOBAL);
110 "embedded squirrel will not be available\n"),
111 librpmsquirrel, dlerror());
113 else if(!((rpmsquirrelNew_p = dlsym(h,
"rpmsquirrelNew"))
114 && (rpmsquirrelRunFile_p = dlsym(h,
"rpmsquirrelRunFile"))
115 && (rpmsquirrelRun_p = dlsym(h,
"rpmsquirrelRun")))) {
117 "embedded squirrel will not be available\n"),
118 librpmsquirrel, dlerror());
129 #if defined(WITH_SQUIRREL)
130 if (!dlopened) loadModule();
131 if (dlopened)
return rpmsquirrelNew_p(av, flags);
136 #if defined(MODULE_EMBED)
137 static const char * _av[] = {
"rpmsquirrel", NULL };
138 SQInteger stacksize = 1024;
139 HSQUIRRELVM v = sq_open(stacksize);
142 if (av == NULL) av = _av;
146 sq_setforeignptr(v, squirrel);
147 sq_setprintfunc(v, rpmsquirrelPrint);
152 sc_pushstring(v,
"ARGS", -1);
154 for (i = 0, i < ac; i++) {
155 sq_pushstring(v, av[i], -1);
156 sq_arrayappend(v, -2);
158 sq_createslot(v, -3);
163 #if !defined(WITH_SQUIRREL)
172 #if defined(WITH_SQUIRREL)
173 if (dlopened)
return rpmsquirrelRunFile_p(squirrel, fn, resultp);
178 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, squirrel, fn);
183 if (fn != NULL && Tcl_EvalFile((Tcl_Interp *)squirrel->I, fn) == SQUIRREL_OK) {
194 #if defined(WITH_SQUIRREL)
195 if (dlopened)
return rpmsquirrelRun_p(squirrel, str, resultp);
201 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, squirrel, str);
205 #if defined(MODULE_EMBED)
207 size_t ns = strlen(str);
209 HSQUIRRELVM v = squirrel->I;
210 SQBool
raise = SQFalse;
211 SQInteger oldtop = sq_gettop(v);
212 SQRESULT res = sq_compilebuffer(v, str, ns, __FUNCTION__,
raise);
214 if (SQ_SUCCEEDED(res)) {
215 SQInteger retval = 0;
217 res = sq_call(v, 1, retval,
raise);
220 sq_settop(v, oldtop);