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)
90 #if defined(SQUIRREL_VERSION_NUMBER) && SQUIRREL_VERSION_NUMBER >= 300 91 static void rpmsquirrelStderr(HSQUIRRELVM v,
const SQChar *s,...)
95 vfprintf(stderr, s, vl);
111 #if defined(WITH_SQUIRREL) 112 static void loadModule(
void) {
113 const char librpmsquirrel[] =
"rpmsquirrel.so";
116 h = dlopen (librpmsquirrel, RTLD_NOW|RTLD_GLOBAL);
120 "embedded squirrel will not be available\n"),
121 librpmsquirrel, dlerror());
123 else if(!((rpmsquirrelNew_p = dlsym(h,
"rpmsquirrelNew"))
124 && (rpmsquirrelRunFile_p = dlsym(h,
"rpmsquirrelRunFile"))
125 && (rpmsquirrelRun_p = dlsym(h,
"rpmsquirrelRun")))) {
127 "embedded squirrel will not be available\n"),
128 librpmsquirrel, dlerror());
139 #if defined(WITH_SQUIRREL) 140 if (!dlopened) loadModule();
141 if (dlopened)
return rpmsquirrelNew_p(av, flags);
146 #if defined(MODULE_EMBED) 147 static const char * _av[] = {
"rpmsquirrel", NULL };
148 SQInteger stacksize = 1024;
149 HSQUIRRELVM v = sq_open(stacksize);
152 if (av == NULL) av = _av;
156 sq_setforeignptr(v, squirrel);
157 #if defined(SQUIRREL_VERSION_NUMBER) && SQUIRREL_VERSION_NUMBER >= 300 158 sq_setprintfunc(v, rpmsquirrelPrint, rpmsquirrelStderr);
160 sq_setprintfunc(v, rpmsquirrelPrint);
166 sc_pushstring(v,
"ARGS", -1);
168 for (i = 0, i < ac; i++) {
169 sq_pushstring(v, av[i], -1);
170 sq_arrayappend(v, -2);
172 sq_createslot(v, -3);
177 #if !defined(WITH_SQUIRREL) 186 #if defined(WITH_SQUIRREL) 187 if (dlopened)
return rpmsquirrelRunFile_p(squirrel, fn, resultp);
192 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, squirrel, fn);
197 if (fn != NULL && Tcl_EvalFile((Tcl_Interp *)squirrel->I, fn) == SQUIRREL_OK) {
208 #if defined(WITH_SQUIRREL) 209 if (dlopened)
return rpmsquirrelRun_p(squirrel, str, resultp);
215 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, squirrel, str);
219 #if defined(MODULE_EMBED) 221 size_t ns = strlen(str);
223 HSQUIRRELVM v = squirrel->I;
224 SQBool
raise = SQFalse;
225 SQInteger oldtop = sq_gettop(v);
226 SQRESULT res = sq_compilebuffer(v, str, ns, __FUNCTION__,
raise);
228 if (SQ_SUCCEEDED(res)) {
229 SQInteger retval = 0;
231 res = sq_call(v, 1, retval,
raise);
234 sq_settop(v, oldtop);
rpmsquirrel rpmsquirrelLink(rpmsquirrel squirrel)
Reference a squirrel interpreter instance.
rpmsquirrel _rpmsquirrelI
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
static void rpmlog(int code, const char *fmt,...)
static rpmsquirrel rpmsquirrelGetPool(rpmioPool pool)
rpmiob rpmiobAppend(rpmiob iob, const char *s, size_t nl)
Append string to I/O buffer.
Yet Another syslog(3) API clone.
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
int argvCount(const ARGV_t argv)
Return no.
rpmRC rpmsquirrelRunFile(rpmsquirrel squirrel, const char *fn, const char **resultp)
Execute squirrel from a file.
static void rpmsquirrelFini(void *_squirrel)
rpmRC rpmsquirrelRun(rpmsquirrel squirrel, const char *str, const char **resultp)
Execute squirrel string.
static rpmsquirrel rpmsquirrelI(void)
rpmiob rpmiobNew(size_t len)
Create an I/O buffer.
struct rpmsquirrel_s * rpmsquirrel
enum rpmRC_e rpmRC
RPM return codes.
char * rpmiobStr(rpmiob iob)
Return I/O buffer (as string).
rpmioPool _rpmsquirrelPool
static int vsnprintf(char *buf, int nb, const char *fmt, va_list ap)
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
rpmsquirrel rpmsquirrelNew(char **av, uint32_t flags)
Create and load a squirrel interpreter.