This completes attaching stdout to all 5 embedded interpreters.

[...@fedora10 wdj]$ rpm --version
rpm (RPM) 5.2.DEVEL
[...@fedora10 wdj]$ cat tinterp
#!/usr/bin/rpm -E -
%{lua:  print("lua:\tHello World!")}
%{perl: print "perl:\tHello World!\n"}
%{python:print "python:\tHello World!"}
%{ruby: puts "ruby:\tHello World!"}
%{tcl:  puts "tcl:\tHello World!"}
[...@fedora10 wdj]$ vi tinterp
[...@fedora10 wdj]$ cat tinterp | rpm -E -
#!/usr/bin/rpm -E -
lua:    Hello World!
perl:   Hello World!

python: Hello World!

ruby:   Hello World!

tcl:    Hello World!



[...@fedora10 wdj]$

If someone who is more knowledgeable about perl
could take a look at completing the xs_init
wiring to the 2nd argument of perl_parse()
so that rpm-perl can be loaded by rpm itself,
I'd be grateful. Perl hurts my head ;-)

Enjoy!

73 de Jeff

On Apr 12, 2009, at 6:28 PM, Jeff Johnson wrote:

 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:   13-Apr-2009 00:28:49
 Branch: HEAD                             Handle: 2009041222284801

 Modified files:
   rpm                     CHANGES
   rpm/rpmio               rpmperl.c rpmpython.c rpmruby.c

 Log:
   - perl: attach stdout to macro expansion buffer with IO::String.

 Summary:
   Revision    Changes     Path
   1.2919      +1  -0      rpm/CHANGES
   2.4         +45 -3      rpm/rpmio/rpmperl.c
   2.5         +1  -0      rpm/rpmio/rpmpython.c
   2.4         +1  -0      rpm/rpmio/rpmruby.c
____________________________________________________________________________

 patch -p0 <<'@@ .'
 Index: rpm/CHANGES
= = = = = = ======================================================================
 $ cvs diff -u -r1.2918 -r1.2919 CHANGES
 --- rpm/CHANGES        12 Apr 2009 19:42:56 -0000      1.2918
 +++ rpm/CHANGES        12 Apr 2009 22:28:48 -0000      1.2919
 @@ -1,5 +1,6 @@

  5.2a3 -> 5.2a4:
+ - jbj: perl: attach stdout to macro expansion buffer with IO::String.
      - rse: use new POPT 1.15 from devtool environment
- jbj: tcl: attach rpmtclIO to macro expansion buffer with Tcl_StackChannel. - jbj: ruby: attach $stdout to macro expansion buffer using StringIO.
 @@ .
 patch -p0 <<'@@ .'
 Index: rpm/rpmio/rpmperl.c
= = = = = = ======================================================================
 $ cvs diff -u -r2.3 -r2.4 rpmperl.c
 --- rpm/rpmio/rpmperl.c        11 Apr 2009 14:47:13 -0000      2.3
 +++ rpm/rpmio/rpmperl.c        12 Apr 2009 22:28:49 -0000      2.4
 @@ -46,6 +46,46 @@
      return (rpmperl) rpmioGetPool(pool, sizeof(*perl));
  }

 +#if defined(NOTYET)
 +EXTERN_C void xs_init (pTHX);
 +
 +EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
 +
 +EXTERN_C void
 +xs_init(pTHX)
 +{
 +      char *file = __FILE__;
 +      dXSUB_SYS;
 +
 +      /* DynaLoader is a special case */
 +      newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
 +}
 +
 +/*...@unchecked@*/
 +static const char * rpmperlInitStringIO = "\
 +use RPM::Constant;\n\
 +use RPM::Header;\n\
 +use RPM::Transaction;\n\
 +use RPM::PackageIterator;\n\
 +use RPM::Problems;\n\
 +use RPM::Files;\n\
 +use RPM::Dependencies;\n\
 +use RPM::Spec;\n\
 +use IO::String;\n\
 +$io = IO::String->new;\n\
 +select $io;\n\
 +";
 +#else
 +#define       xs_init NULL
 +/*...@unchecked@*/
 +static const char * rpmperlInitStringIO = "\
 +use IO::String;\n\
 +$io = IO::String->new;\n\
 +select $io;\n\
 +";
 +
 +#endif
 +
  rpmperl rpmperlNew(const char * fn, int flags)
  {
      static char *embedding[] = { "", "-e", "0" };
 @@ -56,7 +96,6 @@
        perl->fn = xstrdup(fn);
      perl->flags = flags;

 -
  #if defined(WITH_PERLEMBED)
      perl->I = perl_alloc();
      PERL_SET_CONTEXT(my_perl);
 @@ -64,9 +103,10 @@
      perl_construct(my_perl);

PL_origalen = 1; /* don't let $0 assignment update proctitle/ embedding[0] */
 -    xx = perl_parse(my_perl, NULL, 3, embedding, NULL);
 +    xx = perl_parse(my_perl, xs_init, 3, embedding, NULL);
      PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
      perl_run(my_perl);
 +    (void) rpmperlRun(perl, rpmperlInitStringIO, NULL);
  #endif

      return rpmperlLink(perl);
 @@ -85,8 +125,10 @@
        SV * retSV;
        PERL_SET_CONTEXT(my_perl);
        retSV = Perl_eval_pv(my_perl, str, TRUE);
 -      if (resultp)
 +      if (resultp) {
 +          retSV = Perl_eval_pv(my_perl, "${$io->string_ref}", TRUE);
            *resultp = SvPV(retSV, n_a);
 +      }
  #endif
        rc = RPMRC_OK;
      }
 @@ .
 patch -p0 <<'@@ .'
 Index: rpm/rpmio/rpmpython.c
= = = = = = ======================================================================
 $ cvs diff -u -r2.4 -r2.5 rpmpython.c
 --- rpm/rpmio/rpmpython.c      12 Apr 2009 17:26:33 -0000      2.4
 +++ rpm/rpmio/rpmpython.c      12 Apr 2009 22:28:49 -0000      2.5
 @@ -43,6 +43,7 @@
      return (rpmpython) rpmioGetPool(pool, sizeof(*python));
  }

 +/*...@unchecked@*/
  static const char * rpmpythonInitStringIO = "\
  import rpm\n\
  import sys\n\
 @@ .
 patch -p0 <<'@@ .'
 Index: rpm/rpmio/rpmruby.c
= = = = = = ======================================================================
 $ cvs diff -u -r2.3 -r2.4 rpmruby.c
 --- rpm/rpmio/rpmruby.c        12 Apr 2009 17:26:33 -0000      2.3
 +++ rpm/rpmio/rpmruby.c        12 Apr 2009 22:28:49 -0000      2.4
 @@ -54,6 +54,7 @@
      return (rpmruby) rpmioGetPool(pool, sizeof(*ruby));
  }

 +/*...@unchecked@*/
  static const char * rpmrubyInitStringIO = "\
  require 'stringio'\n\
  $stdout = StringIO.new($result, \"w+\")\n\
 @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-...@rpm5.org

______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
Developer Communication List                        rpm-devel@rpm5.org

Reply via email to