4 #define _RPMIOB_INTERNAL
11 #include <sqstdblob.h>
13 #include <sqstdmath.h>
14 #include <sqstdstring.h>
15 #include <sqstdsystem.h>
18 #define _RPMSQUIRREL_INTERNAL
35 #if defined(WITH_SQUIRREL)
36 sq_close((HSQUIRRELVM)squirrel->I);
52 if (_rpmsquirrelPool == NULL) {
60 #if defined(WITH_SQUIRREL)
61 static void rpmsquirrelPrint(HSQUIRRELVM
v,
const SQChar *s, ...)
71 if (nw > -1 && (
size_t)nw < nb)
85 #if defined(SQUIRREL_VERSION_NUMBER) && SQUIRREL_VERSION_NUMBER >= 300
86 static void rpmsquirrelStderr(HSQUIRRELVM v,
const SQChar *s,...)
90 vfprintf(stderr, s, vl);
114 #if defined(WITH_SQUIRREL)
115 static char * _av[] = {
"rpmsquirrel", NULL };
116 SQInteger stacksize = 1024;
117 HSQUIRRELVM v = sq_open(stacksize);
121 if (av == NULL) av = _av;
126 sq_setforeignptr(v, squirrel);
128 #if defined(SQUIRREL_VERSION_NUMBER) && SQUIRREL_VERSION_NUMBER >= 300
129 sq_setprintfunc(v, rpmsquirrelPrint, rpmsquirrelStderr);
131 sq_setprintfunc(v, rpmsquirrelPrint);
134 sqstd_seterrorhandlers(v);
137 sqstd_register_bloblib(v);
138 sqstd_register_iolib(v);
139 sqstd_register_mathlib(v);
140 sqstd_register_stringlib(v);
141 sqstd_register_systemlib(v);
145 SetSqString(v,
"SHELL_VERSION", SHELL_VERSION_STR, SQTrue);
146 SetSqString(v,
"SQUIRREL_VERSION", SQUIRREL_VERSION_SHORT, SQTrue);
147 SetSqString(v,
"PLATFORM", SHELL_PLATFORM, SQTrue);
148 SetSqString(v,
"CPU_ARCH", SHELL_CPUARCH, SQTrue);
150 sq_pushconsttable(v);
151 sq_pushstring(v,
"SQUIRREL_VERSION", -1);
152 sq_pushstring(v, SQUIRREL_VERSION, -1);
153 assert(!SQ_FAILED(sq_newslot(v, -3, SQFalse)));
159 sq_pushstring(v,
"__argc", -1);
160 sq_pushinteger(v, (SQInteger)ac);
161 assert(!SQ_FAILED(sq_newslot(v, -3, SQFalse)));
162 sq_pushstring(v,
"__argv", -1);
164 for (i = 0; av[
i]; ++
i) {
165 sq_pushstring(v, av[i], -1);
166 sq_arrayappend(v, -2);
168 assert(!SQ_FAILED(sq_newslot(v, -3, SQFalse)));
184 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, squirrel, fn);
200 if (b[0] ==
'#' && b[1] ==
'!')
216 fprintf(stderr,
"==> %s(%p,%s)\n", __FUNCTION__, squirrel, str);
220 #if defined(WITH_SQUIRREL)
222 size_t ns = strlen(str);
224 HSQUIRRELVM v = squirrel->I;
225 SQBool
raise = SQFalse;
226 SQInteger oldtop = sq_gettop(v);
227 SQRESULT res = sq_compilebuffer(v, str, ns, __FUNCTION__,
raise);
229 if (SQ_SUCCEEDED(res)) {
230 SQInteger retval = 0;
232 res = sq_call(v, 1, retval,
raise);
235 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 rpmsquirrel rpmsquirrelGetPool(rpmioPool pool)
rpmiob rpmiobAppend(rpmiob iob, const char *s, size_t nl)
Append string to I/O buffer.
int rpmiobSlurp(const char *fn, rpmiob *iobp)
const char const bson_bool_t v
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.
static int xisspace(int c)
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.
const char const bson int mongo_write_concern int flags
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)