RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 03-Jun-2009 04:05:45 Branch: HEAD Handle: 2009060302054401 Modified files: rpm CHANGES rpm/rpmio rpmsquirrel.c rpmsquirrel.h Log: - squirrel: capture stdout in an iob. Summary: Revision Changes Path 1.3014 +1 -0 rpm/CHANGES 2.2 +21 -3 rpm/rpmio/rpmsquirrel.c 2.2 +2 -0 rpm/rpmio/rpmsquirrel.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3013 -r1.3014 CHANGES --- rpm/CHANGES 2 Jun 2009 20:53:05 -0000 1.3013 +++ rpm/CHANGES 3 Jun 2009 02:05:44 -0000 1.3014 @@ -1,5 +1,6 @@ 5.2b1 -> 5.3a1 + - jbj: squirrel: capture stdout in an iob. - jbj: squirrel: add --with-squirrel for embedding squirrel. - jbj: rpmgi: remove duplicated code. - jbj: header: add getter/setter for header parent. @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmsquirrel.c ============================================================================ $ cvs diff -u -r2.1 -r2.2 rpmsquirrel.c --- rpm/rpmio/rpmsquirrel.c 2 Jun 2009 20:53:07 -0000 2.1 +++ rpm/rpmio/rpmsquirrel.c 3 Jun 2009 02:05:45 -0000 2.2 @@ -26,6 +26,8 @@ sq_close((HSQUIRRELVM)squirrel->I); #endif squirrel->I = NULL; + (void)rpmiobFree(squirrel->iob); + squirrel->iob = NULL; } /*...@unchecked@*/ /*...@only@*/ /*...@null@*/ @@ -48,10 +50,26 @@ #if defined(WITH_SQUIRREL) static void rpmsquirrelPrint(HSQUIRRELVM v, const SQChar *s, ...) { + rpmsquirrel squirrel = sq_getforeignptr(v); + size_t nb = 1024; + char * b = xmalloc(nb); va_list va; + va_start(va, s); - (void) vfprintf(stdout, s, va); + while(1) { + int nw = vsnprintf(b, nb, s, va); + if (nw > -1 && (size_t)nw < nb) + break; + if (nb > -1) /* glibc 2.1 (and later) */ + nb = nw+1; + else /* glibc 2.0 */ + nb *= 2; + b = xrealloc(b, nb); + } va_end(va); + + (void) rpmiobAppend(squirrel->iob, b, 0); + b = _free(b); } #endif @@ -69,6 +87,7 @@ ac = argvCount(av); squirrel->I = v; + sq_setforeignptr(v, squirrel); sq_setprintfunc(v, rpmsquirrelPrint); #ifdef NOTYET @@ -85,6 +104,7 @@ } #endif #endif + squirrel->iob = rpmiobNew(0); return rpmsquirrelLink(squirrel); } @@ -144,10 +164,8 @@ sq_settop(v, oldtop); } rc = RPMRC_OK; -#ifdef NOTYET if (resultp) *resultp = rpmiobStr(squirrel->iob); -#endif } #endif return rc; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmsquirrel.h ============================================================================ $ cvs diff -u -r2.1 -r2.2 rpmsquirrel.h --- rpm/rpmio/rpmsquirrel.h 2 Jun 2009 20:53:07 -0000 2.1 +++ rpm/rpmio/rpmsquirrel.h 3 Jun 2009 02:05:45 -0000 2.2 @@ -20,6 +20,8 @@ struct rpmsquirrel_s { struct rpmioItem_s _item; /*!< usage mutex and pool identifier. */ void * I; /* HSQUIRRELVM */ + rpmiob iob; + }; #endif /* _RPMSQUIRREL_INTERNAL */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org