rpm  5.4.14
rpmsquirrel.c
Go to the documentation of this file.
1 #include "system.h"
2 #include <stdarg.h>
3 
4 #include <argv.h>
5 
6 #ifdef WITH_SQUIRREL
7 #include <squirrel.h>
8 #include <sqstdaux.h>
9 #include <sqstdblob.h>
10 #include <sqstdio.h>
11 #include <sqstdmath.h>
12 #include <sqstdstring.h>
13 #include <sqstdsystem.h>
14 #endif
15 
16 #define _RPMSQUIRREL_INTERNAL
17 #include "rpmsquirrel.h"
18 
19 #include "debug.h"
20 
21 /*@unchecked@*/
23 
24 /*@unchecked@*/ /*@relnull@*/
26 
27 static void rpmsquirrelFini(void * _squirrel)
28  /*@globals fileSystem @*/
29  /*@modifies *_squirrel, fileSystem @*/
30 {
31  rpmsquirrel squirrel = (rpmsquirrel) _squirrel;
32 
33 #if defined(WITH_SQUIRREL)
34  sq_close((HSQUIRRELVM)squirrel->I);
35 #endif
36  squirrel->I = NULL;
37  (void)rpmiobFree(squirrel->iob);
38  squirrel->iob = NULL;
39 }
40 
41 /*@unchecked@*/ /*@only@*/ /*@null@*/
43 
44 static rpmsquirrel rpmsquirrelGetPool(/*@null@*/ rpmioPool pool)
45  /*@globals _rpmsquirrelPool, fileSystem @*/
46  /*@modifies pool, _rpmsquirrelPool, fileSystem @*/
47 {
48  rpmsquirrel squirrel;
49 
50  if (_rpmsquirrelPool == NULL) {
51  _rpmsquirrelPool = rpmioNewPool("squirrel", sizeof(*squirrel), -1, _rpmsquirrel_debug,
53  pool = _rpmsquirrelPool;
54  }
55  return (rpmsquirrel) rpmioGetPool(pool, sizeof(*squirrel));
56 }
57 
58 #if defined(WITH_SQUIRREL)
59 static void rpmsquirrelPrint(HSQUIRRELVM v, const SQChar *s, ...)
60 {
61  rpmsquirrel squirrel = sq_getforeignptr(v);
62  size_t nb = 1024;
63  char * b = xmalloc(nb);
64  va_list va;
65 
66  va_start(va, s);
67  while(1) {
68  int nw = vsnprintf(b, nb, s, va);
69  if (nw > -1 && (size_t)nw < nb)
70  break;
71  if (nw > -1) /* glibc 2.1 (and later) */
72  nb = nw+1;
73  else /* glibc 2.0 */
74  nb *= 2;
75  b = xrealloc(b, nb);
76  }
77  va_end(va);
78 
79  (void) rpmiobAppend(squirrel->iob, b, 0);
80  b = _free(b);
81 }
82 
83 #if defined(SQUIRREL_VERSION_NUMBER)
84 static void rpmsquirrelStderr(HSQUIRRELVM v,const SQChar *s,...)
85 {
86  va_list vl;
87  va_start(vl, s);
88  vfprintf(stderr, s, vl);
89  va_end(vl);
90 }
91 #endif
92 
93 #endif
94 
95 /* XXX FIXME: honor 0x8000000 in flags to use global interpreter */
97  /*@globals _rpmsquirrelI @*/
98  /*@modifies _rpmsquirrelI @*/
99 {
100  if (_rpmsquirrelI == NULL)
102  return _rpmsquirrelI;
103 }
104 
105 rpmsquirrel rpmsquirrelNew(char ** av, uint32_t flags)
106 {
107  rpmsquirrel squirrel =
108 #ifdef NOTYET
109  (flags & 0x80000000) ? rpmsquirrelI() :
110 #endif
111  rpmsquirrelGetPool(_rpmsquirrelPool);
112 
113 #if defined(WITH_SQUIRREL)
114  static char * _av[] = { "rpmsquirrel", NULL };
115  SQInteger stacksize = 1024;
116  HSQUIRRELVM v = sq_open(stacksize);
117  int ac;
118 
119  if (av == NULL) av = _av;
120  ac = argvCount((ARGV_t)av);
121 
122  squirrel->I = v;
123  sq_setforeignptr(v, squirrel);
124 #if defined(SQUIRREL_VERSION_NUMBER)
125  sq_setprintfunc(v, rpmsquirrelPrint, rpmsquirrelStderr);
126 #else
127  sq_setprintfunc(v, rpmsquirrelPrint);
128 #endif
129 
130  sq_pushroottable(v);
131 
132  sqstd_register_bloblib(v);
133  sqstd_register_iolib(v);
134  sqstd_register_systemlib(v);
135  sqstd_register_mathlib(v);
136  sqstd_register_stringlib(v);
137 
138  sqstd_seterrorhandlers(v);
139 
140 #ifdef NOTYET
141  { int i;
142  sq_pushroottable(v);
143  sq_pushstring(v, "ARGS", -1);
144  sq_newarray(v, 0);
145  for (i = 0, i < ac; i++) {
146  sq_pushstring(v, av[i], -1);
147  sq_arrayappend(v, -2);
148  }
149  sq_createslot(v, -3);
150  sq_pop(v, 1);
151  }
152 #endif
153 
154 #endif
155  squirrel->iob = rpmiobNew(0);
156 
157  return rpmsquirrelLink(squirrel);
158 }
159 
160 rpmRC rpmsquirrelRunFile(rpmsquirrel squirrel, const char * fn, const char ** resultp)
161 {
162  rpmRC rc = RPMRC_FAIL;
163 
165 fprintf(stderr, "==> %s(%p,%s)\n", __FUNCTION__, squirrel, fn);
166 
167  if (squirrel == NULL) squirrel = rpmsquirrelI();
168 
169 #if defined(NOTYET)
170  if (fn != NULL && Tcl_EvalFile((Tcl_Interp *)squirrel->I, fn) == SQUIRREL_OK) {
171  rc = RPMRC_OK;
172  if (resultp)
173  *resultp = rpmiobStr(squirrel->iob);
174  }
175 #endif
176  return rc;
177 }
178 
179 rpmRC rpmsquirrelRun(rpmsquirrel squirrel, const char * str, const char ** resultp)
180 {
181  rpmRC rc = RPMRC_FAIL;
182 
184 fprintf(stderr, "==> %s(%p,%s)\n", __FUNCTION__, squirrel, str);
185 
186  if (squirrel == NULL) squirrel = rpmsquirrelI();
187 
188 #if defined(WITH_SQUIRREL)
189  if (str != NULL) {
190  size_t ns = strlen(str);
191  if (ns > 0) {
192  HSQUIRRELVM v = squirrel->I;
193  SQBool raise = SQFalse;
194  SQInteger oldtop = sq_gettop(v);
195  SQRESULT res = sq_compilebuffer(v, str, ns, __FUNCTION__, raise);
196 
197  if (SQ_SUCCEEDED(res)) {
198  SQInteger retval = 0;
199  sq_pushroottable(v);
200  res = sq_call(v, 1, retval, raise);
201  }
202 
203  sq_settop(v, oldtop);
204  }
205  rc = RPMRC_OK;
206  if (resultp)
207  *resultp = rpmiobStr(squirrel->iob);
208  }
209 #endif
210  return rc;
211 }
rpmsquirrel rpmsquirrelLink(rpmsquirrel squirrel)
Reference a squirrel interpreter instance.
static char *size_t nb
fgets(3) analogue that reads \ continuations.
Definition: macro.c:409
int rc
Definition: poptALL.c:670
rpmsquirrel _rpmsquirrelI
Definition: rpmsquirrel.c:25
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
static rpmsquirrel rpmsquirrelGetPool(rpmioPool pool)
Definition: rpmsquirrel.c:44
rpmiob rpmiobAppend(rpmiob iob, const char *s, size_t nl)
Append string to I/O buffer.
Definition: rpmiob.c:77
int ac
Definition: rpmgrep.c:1431
int _rpmsquirrel_debug
Definition: rpmsquirrel.c:22
rpmRC res
Definition: signature.c:584
enum rpmRC_e rpmRC
RPM return codes.
Definition: signature.c:616
size_t ns
Definition: db3.c:1892
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
Definition: rpmmalloc.c:220
fprintf(stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, rsactx, sig, sigp)
int argvCount(const ARGV_t argv)
Return no.
Definition: argv.c:71
rpmRC rpmsquirrelRunFile(rpmsquirrel squirrel, const char *fn, const char **resultp)
Execute squirrel from a file.
Definition: rpmsquirrel.c:160
static void rpmsquirrelFini(void *_squirrel)
Definition: rpmsquirrel.c:27
rpmRC rpmsquirrelRun(rpmsquirrel squirrel, const char *str, const char **resultp)
Execute squirrel string.
Definition: rpmsquirrel.c:179
static rpmsquirrel rpmsquirrelI(void)
Definition: rpmsquirrel.c:96
rpmiob rpmiobNew(size_t len)
Create an I/O buffer.
Definition: rpmiob.c:44
struct rpmsquirrel_s * rpmsquirrel
Definition: rpmsquirrel.h:11
char * rpmiobStr(rpmiob iob)
Return I/O buffer (as string).
Definition: rpmiob.c:112
const char * s
Definition: poptALL.c:734
rpmioPool _rpmsquirrelPool
Definition: rpmsquirrel.c:42
static int vsnprintf(char *buf, int nb, const char *fmt, va_list ap)
Definition: rpmps.c:212
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.
Definition: rpmmalloc.c:109
int flags
Definition: fnmatch.c:282
return NULL
Definition: poptALL.c:613
static void
Print copy of spec file, filling in Group/Description/Summary from specspo.
Definition: spec.c:737
char * b
Definition: macro.c:746
#define xmalloc
Definition: system.h:32
ARGstr_t * ARGV_t
Definition: argv.h:12
rpmsquirrel rpmsquirrelNew(char **av, uint32_t flags)
Definition: rpmsquirrel.c:105
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Definition: rpmiotypes.h:647
int i
Definition: spec.c:743
const char ** av
Definition: rpmts-py.c:788
#define xrealloc
Definition: system.h:35
size_t fn
Definition: macro.c:1698