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: 17-Apr-2009 20:42:33 Branch: HEAD Handle: 2009041718423201 Modified files: rpm CHANGES rpm/rpmio rpmficl.c rpmficl.h Log: - ficl: capture stdout from ficl vm. Summary: Revision Changes Path 1.2943 +1 -0 rpm/CHANGES 2.2 +39 -5 rpm/rpmio/rpmficl.c 2.2 +2 -1 rpm/rpmio/rpmficl.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2942 -r1.2943 CHANGES --- rpm/CHANGES 17 Apr 2009 16:10:21 -0000 1.2942 +++ rpm/CHANGES 17 Apr 2009 18:42:32 -0000 1.2943 @@ -1,5 +1,6 @@ 5.2a4 -> 5.2b1: + - jbj: ficl: capture stdout from ficl vm. - jbj: ficl: wire-up %post -p <ficl>. - jbj: ficl: wire-up %{ficl:...}. capturing stdout todo++ ... - jbj: ficl: add a FICL interpreter wrapper. @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmficl.c ============================================================================ $ cvs diff -u -r2.1 -r2.2 rpmficl.c --- rpm/rpmio/rpmficl.c 17 Apr 2009 16:10:23 -0000 2.1 +++ rpm/rpmio/rpmficl.c 17 Apr 2009 18:42:33 -0000 2.2 @@ -11,11 +11,24 @@ #include "debug.h" /*...@unchecked@*/ -int _rpmficl_debug = 1; +int _rpmficl_debug = 0; /*...@unchecked@*/ /*...@relnull@*/ rpmficl _rpmficlI = NULL; +#if defined(WITH_FICL) +/* Capture stdout from FICL VM in a buffer. */ +static void rpmficlTextOut(ficlCallback *callback, char *text) + /*...@*/ +{ + rpmficl ficl = (rpmficl) callback->context; + + if (ficl->iob == NULL) + ficl->iob = rpmiobNew(0); + (void) rpmiobAppend(ficl->iob, text, 0); +} +#endif + static void rpmficlFini(void * _ficl) /*...@globals fileSystem @*/ /*...@modifies *_ficl, fileSystem @*/ @@ -26,8 +39,10 @@ ficlSystem * sys = ficl->sys; ficlSystemDestroy(sys); #endif - ficl->vm = NULL; ficl->sys = NULL; + ficl->vm = NULL; + (void) rpmiobFree(ficl->iob); + ficl->iob = NULL; } /*...@unchecked@*/ /*...@only@*/ /*...@null@*/ @@ -53,6 +68,7 @@ #if defined(WITH_FICL) static const char * _av[] = { "rpmficl", NULL }; + ficlSystemInformation fsi; ficlSystem *sys; ficlVm *vm; int ac; @@ -61,13 +77,18 @@ if (av == NULL) av = _av; ac = argvCount(av); - sys = ficlSystemCreate(NULL); + ficlSystemInformationInitialize(&fsi); + fsi.context = (void *)ficl; + fsi.textOut = rpmficlTextOut; + + sys = ficlSystemCreate(&fsi); ficl->sys = sys; ficlSystemCompileExtras(sys); vm = ficlSystemCreateVm(sys); ficl->vm = vm; xx = ficlVmEvaluate(vm, ".ver .( " __DATE__ " ) cr quit"); + #ifdef NOTYET if (ac > 1) { char b[256]; @@ -76,6 +97,12 @@ } #endif + if (ficl->iob) { + const char * s = rpmiobStr(ficl->iob); +if (_rpmficl_debug && s && *s) +fprintf(stderr, "%s", s); + (void)rpmiobEmpty(ficl->iob); + } #endif return rpmficlLink(ficl); @@ -119,8 +146,15 @@ if (str != NULL) { #if defined(WITH_FICL) ficlVm *vm = ficl->vm; - int xx = ficlVmEvaluate(vm, (char *)str); - rc = (xx ? RPMRC_OK : RPMRC_FAIL); + switch (ficlVmEvaluate(vm, (char *)str)) { + default: + break; + case FICL_VM_STATUS_OUT_OF_TEXT: + rc = RPMRC_OK; + if (resultp && ficl->iob) + *resultp = rpmiobStr(ficl->iob); + break; + } #endif } return rc; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmficl.h ============================================================================ $ cvs diff -u -r2.1 -r2.2 rpmficl.h --- rpm/rpmio/rpmficl.h 17 Apr 2009 16:10:23 -0000 2.1 +++ rpm/rpmio/rpmficl.h 17 Apr 2009 18:42:33 -0000 2.2 @@ -19,8 +19,9 @@ #if defined(_RPMFICL_INTERNAL) struct rpmficl_s { struct rpmioItem_s _item; /*!< usage mutex and pool identifier. */ - void * vm; /* ficlVm */ void * sys; /* ficlSystem */ + void * vm; /* ficlVm */ + rpmiob iob; }; #endif /* _RPMFICL_INTERNAL */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org