summaryrefslogtreecommitdiff
path: root/rpmio/rpmlua.c
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2011-05-24 20:28:16 +0300
committerPanu Matilainen <pmatilai@redhat.com>2011-05-24 20:41:38 +0300
commitecfece7ec0d0eb0485745568d10dabc428e92824 (patch)
tree52de2136d00d67ed935916b05d92907ac07d3d54 /rpmio/rpmlua.c
parent48b5879931ef2ef3039b22123d6aaad17657618e (diff)
downloadlibrpm-tizen-ecfece7ec0d0eb0485745568d10dabc428e92824.tar.gz
librpm-tizen-ecfece7ec0d0eb0485745568d10dabc428e92824.tar.bz2
librpm-tizen-ecfece7ec0d0eb0485745568d10dabc428e92824.zip
Add support for nested Lua macro expansion (RhBug:490740)
- Lift the printbuffer accounting out of rpmlua into a struct of its own (Funny thing, this looks a whole lot like the macro expansion buffer and Good Ole StringBuf Brothers ... Boys ... Mam. Unify them one of these days maybe) - Replace the simplistic on/off printbuffer with a stack of buffers, fixup the lone caller to use the new internal push/pop API.
Diffstat (limited to 'rpmio/rpmlua.c')
-rw-r--r--rpmio/rpmlua.c60
1 files changed, 40 insertions, 20 deletions
diff --git a/rpmio/rpmlua.c b/rpmio/rpmlua.c
index 1f9254a74..fa8eed36c 100644
--- a/rpmio/rpmlua.c
+++ b/rpmio/rpmlua.c
@@ -31,6 +31,13 @@
\
)
+struct rpmluapb_s {
+ size_t alloced;
+ size_t used;
+ char *buf;
+ rpmluapb next;
+};
+
static rpmlua globalLuaState = NULL;
static int luaopen_rpm(lua_State *L);
@@ -124,20 +131,31 @@ void *rpmluaGetData(rpmlua _lua, const char *key)
return getdata(lua->L, key);
}
-void rpmluaSetPrintBuffer(rpmlua _lua, int flag)
+void rpmluaPushPrintBuffer(rpmlua _lua)
{
INITSTATE(_lua, lua);
- lua->storeprint = flag;
- free(lua->printbuf);
- lua->printbuf = NULL;
- lua->printbufsize = 0;
- lua->printbufused = 0;
+ rpmluapb prbuf = xcalloc(1, sizeof(*prbuf));
+ prbuf->buf = NULL;
+ prbuf->alloced = 0;
+ prbuf->used = 0;
+ prbuf->next = lua->printbuf;
+
+ lua->printbuf = prbuf;
}
-const char *rpmluaGetPrintBuffer(rpmlua _lua)
+char *rpmluaPopPrintBuffer(rpmlua _lua)
{
INITSTATE(_lua, lua);
- return lua->printbuf;
+ rpmluapb prbuf = lua->printbuf;
+ char *ret = NULL;
+
+ if (prbuf) {
+ ret = prbuf->buf;
+ lua->printbuf = prbuf->next;
+ free(prbuf);
+ }
+
+ return ret;
}
static int pushvar(lua_State *L, rpmluavType type, void *value)
@@ -773,16 +791,17 @@ static int rpm_print (lua_State *L)
s = lua_tostring(L, -1); /* get result */
if (s == NULL)
return luaL_error(L, "`tostring' must return a string to `print'");
- if (lua->storeprint) {
+ if (lua->printbuf) {
+ rpmluapb prbuf = lua->printbuf;
int sl = lua_strlen(L, -1);
- if (lua->printbufused+sl+1 > lua->printbufsize) {
- lua->printbufsize += sl+512;
- lua->printbuf = xrealloc(lua->printbuf, lua->printbufsize);
+ if (prbuf->used+sl+1 > prbuf->alloced) {
+ prbuf->alloced += sl+512;
+ prbuf->buf = xrealloc(prbuf->buf, prbuf->alloced);
}
if (i > 1)
- lua->printbuf[lua->printbufused++] = '\t';
- memcpy(lua->printbuf+lua->printbufused, s, sl+1);
- lua->printbufused += sl;
+ prbuf->buf[prbuf->used++] = '\t';
+ memcpy(prbuf->buf+prbuf->used, s, sl+1);
+ prbuf->used += sl;
} else {
if (i > 1)
(void) fputs("\t", stdout);
@@ -790,14 +809,15 @@ static int rpm_print (lua_State *L)
}
lua_pop(L, 1); /* pop result */
}
- if (!lua->storeprint) {
+ if (!lua->printbuf) {
(void) fputs("\n", stdout);
} else {
- if (lua->printbufused+1 > lua->printbufsize) {
- lua->printbufsize += 512;
- lua->printbuf = xrealloc(lua->printbuf, lua->printbufsize);
+ rpmluapb prbuf = lua->printbuf;
+ if (prbuf->used+1 > prbuf->alloced) {
+ prbuf->alloced += 512;
+ prbuf->buf = xrealloc(prbuf->buf, prbuf->alloced);
}
- lua->printbuf[lua->printbufused] = '\0';
+ prbuf->buf[prbuf->used] = '\0';
}
return 0;
}