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

Reply via email to