[#11815] problems with DBM module — Eric Sven Ristad <ristad@...>
[#11822] RCR: Input XML support in the base Ruby — Dave Thomas <Dave@...>
Hi,
TAKAHASHI Masayoshi <maki@inac.co.jp> writes:
On Fri, 2 Mar 2001, Dave Thomas wrote:
David Alan Black <dblack@candle.superlink.net> writes:
[#11832] Re: RCR: Input XML support in the base Ruby — "Conrad Schneiker" <schneik@...>
Dave Thomas Wrote:
[#11868] Re: RCR: Input XML support in the base Ruby — "Mike Wilson" <wmwilson01@...>
Ok, first off I feel I am at least semi-intelligent
[#11876] Option to allow Python style indenting? — "chris" <nospam@6666666.com>
Don't know whether this discussion would be better here or on the email
[#11884] Re: Seeking Ruby/Tk sensei... — Kevin Smith <sent@...>
>Hal 9000 Fulton wrote:
[#11893] Re: rewrite with Ruby — ts <decoux@...>
>>>>> "M" == Max Ischenko <max@malva.com.ua> writes:
>>>>> "M" == Max Ischenko <max@malva.com.ua> writes:
I have a class where the initializer takes a filename
[#11915] Why I bought a second copy of The Book. — jfn@... (Jeremy Nelson)
It was the book that exposed me to ruby and caused me to absolutely fall
[#11960] Not Ruby, for me, for the moment at least — "Michael Kreuzer" <mkreuzer@... (nospam)>
I wrote on this newsgroup last weekend about how I was considering using
"Michael Kreuzer" <mkreuzer(nospam)@mail.usyd.edu.au> wrote in
[#11986] possible memory leak in GDBM/gdbm — Eric Sven Ristad <ristad@...>
The following program suggests there is a small memory leak in
[#12000] Re: Seeking Ruby/Tk sensei... — "Conrad Schneiker" <schneik@...>
Kevin Smith wrote:
[#12003] Re: How do I reach members from a Proc? — "Conrad Schneiker" <schneik@...>
Dave Thomas wrote:
On Mon, 5 Mar 2001, Conrad Schneiker wrote:
[#12014] ANN: Memoize 0.1.2 — Robert Feldt <feldt@...>
Hi,
Robert Feldt <feldt@ce.chalmers.se> wrote in
[#12019] hooking/wrapping all of a classes methods — David Alan Black <dblack@...>
Hello --
[#12023] French RUG ? — "Jerome" <jeromg@...>
Hi fellow rubyers,
Tammo Freese <tammo.freese@offis.de> writes:
[#12048] Windows Installer questions — andy@... (Andrew Hunt)
[#12052] Re: RCR: shortcut for instance variable initialization — "Ben Tilly" <ben_tilly@...>
Dave Thomas <Dave@PragmaticProgrammer.com> wrote:
> From: Ben Tilly [mailto:ben_tilly@hotmail.com]
"Christoph Rippel" <crippel@primenet.com> writes:
[#12061] Ruby & AOP — "Dennis Decker Jensen" <dennisdecker@...>
Hi !
[#12093] Another hook — Dave Thomas <Dave@...>
[#12097] RCR: replacing 'caller' — Robert Feldt <feldt@...>
Hi,
[#12102] Re: Another hook — "Conrad Schneiker" <schneik@...>
Dave Thomas wrote:
[#12103] disassembling and reassembling a hash — raja@... (Raja S.)
Given a hash, h1, will the following always hold?
ts <decoux@moulon.inra.fr> writes:
[#12116] String.gsub() — Mike Bowler <mbowler@...>
The method String.gsub() isn't working the way I expected (or the way
[#12124] Is Ruby japanese-centered? — "Henning VON ROSEN" <hvrosen@...>
[matz writes]
In article <MABBIFGPDKFFOJPHLCLIOEAKCBAA.hvrosen@world-online.no>,
[#12135] Re: hash.invert loses data if equal values exist - is this the right behaviour? — Dave Thomas <Dave@...>
Tammo Freese <tammo.freese@offis.de> writes:
[#12144] New submissions to the Ruby Application Archive? — "Lyle Johnson" <ljohnson@...>
OK, I promise I looked around for this answer before posting here ;)
On Wed, 7 Mar 2001, Lyle Johnson wrote:
[#12155] RCR: Block form of Dir.chdir — Robert Feldt <feldt@...>
Hi,
[#12174] Nonblocking Read — Alex McHale <lists@...>
Hi there,
[#12179] Re: (long) Re: hash.invert loses data if equal values exist - is this the right behaviour? — Dave Thomas <Dave@...>
gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) writes:
Hi,
On Tuesday 06 March 2001 22:36, you wrote:
> From: Charles Hixson [mailto:charleshixsn@earthhlink.net]
[#12182] Re: Nonblocking Read] — Alex McHale <lists@...>
> IO#sysread is what you are looking for.
[#12204] FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1>
Ruby is, indeed, a very well designed language.
>>>>> "GK" == GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp> writes:
In message "[ruby-talk:12250] Re: FEATURE REQUEST: 'my' local variables"
Hi,
In message "[ruby-talk:12289] Re: FEATURE REQUEST: 'my' local variables"
Hi,
In message "[ruby-talk:12457] Re: FEATURE REQUEST: 'my' local variables"
On Monday 12 March 2001 00:39, GOTO Kentaro wrote:
matz@zetabits.com (Yukihiro Matsumoto) writes:
Hi,
On Tue, 13 Mar 2001, Yukihiro Matsumoto wrote:
> From: Stephen White [mailto:spwhite@chariot.net.au]
[#12229] random chars — Urban Hafner <the-master-of-bass@...>
Hello everybody, I think/hope I have some simple questions.
At 22:35 07.03.01 +0900, you wrote:
Tammo Freese <tammo.freese@offis.de> wrote:
[#12237] [ANN] NQXML v2.0 adds DOM, DOCTYPE, and ENTITY — Jim Menard <jimm@...>
NQXML is a pure Ruby implementation of an XML tokenizer, a SAX parser, and
[#12244] [ANN] NQXML v0.2.2 — Jim Menard <jimm@...>
In the spirit of "release early, release often", version 0.2.2 of NQXML can
[#12308] GUI Toolkit for Ruby — jjthrash@...
Hi all,
jjthrash@pobox.com wrote in message
[#12329] Math package — Mathieu Bouchard <matju@...>
In message "[ruby-talk:12329] Math package"
Hi,
[#12330] Haskell goodies, RCR and challenge — Robert Feldt <feldt@...>
Hi,
Hi,
Hi,
On Sat, 10 Mar 2001, Yukihiro Matsumoto wrote:
[#12331] Re: Q re looping structures — ts <decoux@...>
>>>>> "M" == Mathieu Bouchard <matju@sympatico.ca> writes:
[#12332] ...and the challenge — Robert Feldt <feldt@...>
Hi again,
On Sat, 10 Mar 2001, Robert Feldt wrote:
> On Sat, 10 Mar 2001, Robert Feldt wrote:
[#12349] Can Ruby-GTK display Gif Png or Jpeg files? — Phlip <phlip_cpp@...>
Ruby-san:
Kent,
On Saturday 10 March 2001 15:30, Samantha Atkins wrote:
[#12369] Re: FEATURE REQUEST: 'my' local variables — Kevin Smith <sent@...>
matz@zetabits.com wrote:
[#12443] Re: ...and the challenge — "Benjamin J. Tilly" <ben_tilly@...>
>===== Original Message From Mathieu Bouchard <matju@sympatico.ca> =====
[#12444] class variables — Max Ischenko <max@...>
[#12446] Locale support in Ruby — Ollivier Robert <roberto@...>
Hello,
[#12523] rb_ary_each and hash — User Tcovert <tcovert@...>
awesome! thanks all!
[#12524] C++ is like teenage sex. — Stephen White <spwhite@...>
Forwarded message from glen mccready <gkm@petting-zoo.net> -----
[#12529] Re: Sum of Squares — "rashworth" <rashworth@...>
Thank you for your note. The new coding worked just fine.
[#12540] Strange segmentation fault problem with C++ extension — "Paul C" <paul_c@...>
Hi,
[#12601] http page download question — "Ian Marsman" <imarsman@...>
I am writing a script to download webpages from a favourite radio program
[#12606] Order, chaos, and change requests :) — Dave Thomas <Dave@...>
>>>>> "DT" == Dave Thomas <Dave@PragmaticProgrammer.com> writes:
[#12635] email address regexp — "David Fung" <dfung@...>
i would like to locate probable email addresses in a bunch of text files,
In article <m18zm531s9.fsf@halfdome.holdit.com>,
[#12646] police warns you -- Perl is dangerous!! — Leo Razoumov <see_signature@127.0.0.1>
I just read this story on Slashdot
On 14 Mar 2001 11:46:35 -0800, Leo Razoumov <see_signature@127.0.0.1> wrote:
On Wednesday 14 March 2001 15:40, Pete Kernan wrote:
On Fri, 16 Mar 2001, W. Kent Starr wrote:
Amos wrote:
[#12655] Re: FEATURE REQUEST: 'my' local variables — "Benjamin J. Tilly" <ben_tilly@...>
>===== Original Message From Leo Razoumov <see_signature@127.0.0.1> =====
[#12689] refactoring ruby code — Pat Eyler <pate@...>
To help myself learn more about Ruby, I'm starting to translate
[#12706] Library packaging — "Nathaniel Talbott" <ntalbott@...>
I have a project that I'm working on that needs to live two different lives,
"Nathaniel Talbott" <ntalbott@rolemodelsoft.com> writes:
Would it be possible to use some sort of jar style packaging - ie distribute
Hi,
matz@zetabits.com (Yukihiro Matsumoto) writes:
[#12738] Parser? — Hugh Sasse Staff Elec Eng <hgs@...>
Has anyone written a parser for Ruby in Ruby?
[#12754] assert_exception question — Pat Eyler <pate@...>
Okay, I'm reading along between several docs and now I'm confused ...
[#12768] Re: Tk Demo in Windows — ts <decoux@...>
>>>>> "R" == Ron Jeffries <ronjeffries@acm.org> writes:
[#12803] Deja vu? — Roy Smith <roy@...>
After years of reading people on c.l.python interject comments about Ruby,
On Tue, 20 Mar 2001 11:20:58 +0900, Hal E. Fulton
[#12821] units of measure — Mathieu Bouchard <matju@...>
[#12825] Floating point performance & Garbage collection — Jean-Sebastien ROY <jean-sebastien.roy@...>
I recently came across a little performance problem I have difficulties
In article
On Mon, 19 Mar 2001, Jean-Sebastien ROY wrote:
In article <Pine.LNX.3.96.1010319225134.15108F-100000@relayer>,
On Tue, 20 Mar 2001, Jean-Sebastien ROY wrote:
[#12829] converting a string to a class — "Doug Edmunds" <dae_alt3@...>
I want to concatenate strings which
[#12840] Looking for a decent compression scheme — Dave Thomas <Dave@...>
Dave Thomas wrote:
On Mon, 19 Mar 2001, Michael Neumann wrote:
Robert Feldt wrote:
[#12892] find.rb — Tyler Wardhaugh <tgw@...>
Hello, I'm new Ruby and I like it very much. The dynamic extensibility
Hi,
"Christoph Rippel" <crippel@primenet.com> writes:
> From: dave@thomases.com [mailto:dave@thomases.com]On Behalf Of Dave
[#12895] differences between range and array — "Doug Edmunds" <dae_alt3@...>
This code comes from the online code examples for
On Tue, 20 Mar 2001, Hee-Sob Park wrote:
Jim Freeze <jim@freeze.org> writes:
On Tue, 20 Mar 2001, Dave Thomas wrote:
[#12905] Native/pthreads in Ruby — Christopher Petrilli <petrilli@...>
I read everything I could find in the archives talking about
Hi,
On Tue, Mar 20, 2001 at 05:34:27PM +0900, Yukihiro Matsumoto wrote:
[#12906] RubyConf 2001 update — "Guy N. Hurst" <gnhurst@...>
RubyConf 2001 Update
[#12921] fork problem??? — "Hal E. Fulton" <hal9000@...>
Hello all,
[#12929] Re: animal is onion as show stopper — "Conrad Schneiker" <schneik@...>
Apparently sleep-deprived Hal wrote:
[#12935] How to add accessors dynamically? — Ville Mattila <mulperi@...>
Hello
[#12941] rubicon version? — Hugh Sasse Staff Elec Eng <hgs@...>
ISTR that Rubicon was going into the CVS base of Ruby. Now 1.6.3 is out
[#12960] TextBox ListBox — Ron Jeffries <ronjeffries@...>
Attached is a little Spike that Chet and I are doing. It is a
On Wed, 21 Mar 2001 04:36:38 +0900, rise <rise@knavery.net> wrote:
[#12991] [ANN] Lapidary 0.2.0 — "Nathaniel Talbott" <ntalbott@...>
Well, here's my first major contribution to the Ruby world: Lapidary. It's a
How is this different from RubyUnit?
>>>>> "Nathaniel" == Nathaniel Talbott <ntalbott@rolemodelsoft.com> writes:
jweirich@one.net [mailto:jweirich@one.net] wrote:
"Nathaniel Talbott" <ntalbott@rolemodelsoft.com> writes:
[#13020] instrumenting system resources — Eric Sven Ristad <ristad@...>
[#13028] mkmf question — Luigi Ballabio <luigi.ballabio@...>
[#13033] How do I properly munge stdout and stderr when using IO.popen? — Donald Sharp <sharpd@...>
Or alternatively is there a better way to do this?
In [ruby-talk:13033], Donald Sharp <sharpd@cisco.com> wrote:
I can't force the end user to choose a particular shell.
[#13039] extending existing classes. — Hugh Sasse Staff Elec Eng <hgs@...>
I've run up against something I thought I knew how to solve, but...
[#13046] Philosophical question: extension v. pure ruby — Colin Steele <colin@...2.com>
[#13054] Questions about ruby — Roy Patrick Tan <rtan@...>
Hi, I am preparing a presentation about Ruby, for the programming
[#13064] Lapidary questions — Paul Pladijs <ppladijs@...>
[#13079] Thread Safe — Rogers Gene A Civ 96 CG/SCTOB <gene.rogers@...>
Here's a question (stupid, maybe):
[#13086] Amusing contrast — Bob Kline <bkline@...>
I was struck by the discrepancy between this quote from the Ruby man
[#13099] xmlparser installation woes — Phil Suh <phil@...>
[#13117] ZPT, a next-generation template technology (repost) — "Conrad Schneiker" <schneik@...>
FYI. Thought some Rubies might be interested in this.
[#13138] How would Ruby say this? — "Lyle Johnson" <ljohnson@...>
One group of C++ functions I'm wrapping for FXRuby have signatures like
"Lyle Johnson" <ljohnson@resgen.com> writes:
[#13163] Re: Amusing contrast — Kevin Smith <sent@...>
Dave Thomas wrote:
[#13182] Re: email address regexp (fwd) — Paul Pladijs <paul.pladijs@...>
[#13185] Reading a file backwards — "Daniel Berger" <djberg96@...>
Hi all,
> Hi Dan,
On Sun, 25 Mar 2001, Daniel Berger wrote:
"Mathieu Bouchard" <matju@sympatico.ca> wrote in message
On Mon, 26 Mar 2001, Daniel Berger wrote:
Ernest Ellingson <erne@powernav.com> writes:
[#13225] Installation Woes — "John Kaurin" <jkaurin@...>
System: alphaev6-osf4.0f
[#13226] Re: Randal in Ruby-land? (was: email address regexp) — "Benjamin J. Tilly" <ben_tilly@...>
>===== Original Message From claird@starbase.neosoft.com (Cameron Laird) =====
[#13236] drb and "recycled objects" errors — Jimmy Olgeni <olgeni@...>
[#13240] hash problem — Urban Hafner <the-master-of-bass@...>
Hello everybody,
[#13246] Re: Randal in Ruby-land? (was: email address regexp) — "Conrad Schneiker" <schneik@...>
Mathieu Bouchard wrote:
Hi,
Hi,
> From: Yukihiro Matsumoto [mailto:matz@zetabits.com]
On Thu, 29 Mar 2001 23:11:03 +0900, Christoph Rippel pontificated:
On Fri, 30 Mar 2001, Pete Kernan wrote:
[#13255] This is going to sound crazy, but... — Dave Thomas <Dave@...>
[#13294] ruby slowww socket handling — Joseph McDonald <joe@...>
[#13303] Reloading files — "Nathaniel Talbott" <ntalbott@...>
First of all, a confession: Lapidary's GTK::TestRunner had a show stopper
[#13318] hash slice implementaion — "Hee-Sob Park" <phasis@...>
[#13369] Buffered and non-buffered IO — Lloyd Zusman <ljz@...>
Could anyone point me to some documentation that describes how I could
[#13374] Passing an array to `exec'? — Lloyd Zusman <ljz@...>
I'd like to do the following:
[#13388] Using Antlr for Ruby? (was RE: Re: why won't "( a) = 1" parse?) — Christophe Broult <cbroult@...>
Hi,
Hi,
[#13397] Multidimensional arrays and hashes? — Lloyd Zusman <ljz@...>
Is it possible in ruby to make use of constructs that correspond to
masa@stars.gsfc.nasa.gov writes:
> From: nosuzuki@e-mail.ne.jp [mailto:nosuzuki@e-mail.ne.jp]On Behalf Of
"Christoph Rippel" <crippel@primenet.com> writes:
[ruby-talk:12587] Re: Strange segmentation fault problem with C++ extension [source] LONG
"ts" <decoux@moulon.inra.fr> wrote in message
news:200103130555.f2D5tsr17121@orsay1.moulon.inra.fr...
> >>>>> "P" == Paul C <paul_c@passtheaardvark.com> writes:
>
> P> zipLocalEntry = ZipLocalEntry_new ( ptr_entry ) ;
>
> What is missing is the source of ZipLocalEntry_new, to see how you create
> your object.
>
>
> Guy Decoux
For some reason my news account doesnt seem to like me posting attachments
(or at least they dont show up at my end) and I have therefore attached the
source code for the offending module below. If anyone would like me to email
as an attachment pse let me know.
Apologies to anyone who ends up getting this multiple times
========= Original Message =========
Guy,
I am attaching the source code for the module. To compile it you need to
install the zipios++ (zipios.sourceforge.com) and run extconf.rb
with --zipios-(include|lib) set appropriately (extconf.rb is a bit of a hack
in order to detect the c++ libs properly).
I have added some instrumentation to the ZipLocalEntry_new - the debug trace
with this added is below.
Thanks, Paul
=========== DEBUG TRACE ===========
# irb --prompt xmp
require 'Zip'
==>true
z = Zip::ZipFile.new "test.zip"
==>#<Zip::ZipFile:0x816c4ec @name="test.zip">
z.entries { |e| print e.path, "\n" } # Get Zip Directory
(zip.cpp:279) MSG: Entering Function #ZipLocalEntry_new
(zip.cpp:280) PTR: ConstEntryPointer ->135928464
(zip.cpp:284) PTR: zipLocalEntry ->135469952
(zip.cpp:289) VALUE: rbZipLocalEntry -> #<Zip::ZipEntry:0x815f738
@path="extconf.rb">
(zip.cpp:290) MSG: Leaving Function #ZipLocalEntry_new
extconf.rb
(zip.cpp:279) MSG: Entering Function #ZipLocalEntry_new
(zip.cpp:280) PTR: ConstEntryPointer ->135928468
(zip.cpp:284) PTR: zipLocalEntry ->135470080
(zip.cpp:289) VALUE: rbZipLocalEntry -> #<Zip::ZipEntry:0x815f558
@path="Makefile">
(zip.cpp:290) MSG: Leaving Function #ZipLocalEntry_new
Makefile
==>#<Zip::ZipFile:0x816c4ec @name="test.zip">
z.entry "extconf.rb" # OK
(zip.cpp:403) MSG: Entering Function #ZipFile_entry
(zip.cpp:404) VALUE: self -> #<Zip::ZipFile:0x816c4ec @name="test.zip">
(zip.cpp:408) PTR: ZipFile ->135501760
(zip.cpp:418) MSG: GetEntry OK
(zip.cpp:420) PTR: ConstEntryPointer ->135871104
(zip.cpp:279) MSG: Entering Function #ZipLocalEntry_new
(zip.cpp:280) PTR: ConstEntryPointer ->135871104
(zip.cpp:284) PTR: zipLocalEntry ->135489024
(zip.cpp:289) VALUE: rbZipLocalEntry -> #<Zip::ZipEntry:0x81545cc
@path="extconf.rb">
(zip.cpp:290) MSG: Leaving Function #ZipLocalEntry_new
(zip.cpp:422) VALUE: zipLocalEntry -> #<Zip::ZipEntry:0x81545cc
@path="extconf.rb">
(zip.cpp:423) MSG: Leaving Function #ZipFile_entry
==>#<Zip::ZipEntry:0x81545cc @path="extconf.rb">
z.entry "zzzzzzz" # Invalid Entry
(zip.cpp:403) MSG: Entering Function #ZipFile_entry
(zip.cpp:404) VALUE: self -> #<Zip::ZipFile:0x816c4ec @name="test.zip">
(zip.cpp:408) PTR: ZipFile ->135501760
(zip.cpp:413) MSG: GetEntry Failed
RuntimeError: Entry not found
(irb):10:in `entry'
(irb):10:in `irb_binding'
z.entry "extconf.rb" # Should be OK
(zip.cpp:403) MSG: Entering Function #ZipFile_entry
(zip.cpp:404) VALUE: self -> #<Zip::ZipFile:0x816c4ec @name="test.zip">
(zip.cpp:408) PTR: ZipFile ->135501760
(zip.cpp:418) MSG: GetEntry OK
(zip.cpp:420) PTR: ConstEntryPointer ->136008400
(zip.cpp:279) MSG: Entering Function #ZipLocalEntry_new
(zip.cpp:280) PTR: ConstEntryPointer ->136008400
(zip.cpp:284) PTR: zipLocalEntry ->135126848
(zip.cpp:289) VALUE: rbZipLocalEntry -> #<Zip::ZipEntry:0x814d2f4
@path="extconf.rb">
(zip.cpp:290) MSG: Leaving Function #ZipLocalEntry_new
(zip.cpp:422) VALUE: zipLocalEntry -> #<Zip::ZipEntry:0x814d2f4
@path="extconf.rb">
(zip.cpp:423) MSG: Leaving Function #ZipFile_entry
(irb):12: [BUG] Segmentation fault
ruby 1.6.3 (2001-03-07) [i386-netbsd1.5]
Abort (core dumped)
====== extconf.rb =====
require 'mkmf'
CPP.gsub! /g?cc/, "c++"
LINK.gsub! /g?cc/, "c++"
dir_config ( "zipios" ) ;
if ( have_header ( "zipios++/zipfile.h" ) and
have_library ( "gcc", "__pure_virtual" ) and
have_library ( "zipios", "FListScannerwrap" ) and
have_library ( "z", "inflate" ) and
have_library ( "stdc++", "cin" ) )
$defs[-1].tr! ( "++", "" )
create_makefile ( "Zip" )
end
====== zip.cpp =====
//
// zip.cpp
//
// Ruby extension to use the Zipios++ Zip file reader library
// (http://zipios.sourceforge.com)
//
// Module
//
// Zip - Module Namespace
//
// Classes
//
// Zip::ZipFile - Zip File
// Zip::ZipEntry - Zip File Entry
//
// Methods
//
// Zip::ZipFile
// ============
//
// Zip::ZipFile#new (fileName, [fileOffset=0]) -> ZipFile
//
// Constructor - open zip file
//
// Zip::ZipFile#openEmbeddedZipFile (fileName) -> ZipFile
//
// Constructor - open zIp file appended to another file
//
// File must have Zip file offset encoded in last 4 bytes
// in Zip file (little endian byte order) eg. using
// 'appendzip' program from zipios++ distribution
//
// ZipFile#inspect -> String
//
// ZipFile#name -> String
//
// Return Zip file name
//
// ZipFile#items -> Number
//
// Returns number of items in ZipFile
//
// ZipFile#entry -> ZipEntry List
//
// Return ZipEntry list (contents) for ZipFile
// In block context call block once for each entry
//
// ZipFile#entries ( pathString ) -> ZipEntry
//
// Return ZipEntry for given path
// Raises RuntimeError is entry not found
//
// ZipFile#getData ( ZipEntry | pathString ) -> String
//
// Returns uncompressed data for ZipEntry or pathString
// Raises RuntimeError is entry not found
//
// Zip::ZipEntry
// =============
//
// Note: There is no direct sconstructor for Zip::ZipEntry - must
// created through ZipFile#entry or ZipFile#entries
//
// ZipEntry#inspect -> String
//
// (The following ZipEntry methods are largely accessors for the
// ZipEntry file attributes)
//
// ZipEntry#comment -> String
// ZipEntry#compressed_size -> Number
// ZipEntry#crc -> Number (this doesnt look right??)
// ZipEntry#size -> Number
// ZipEntry#time -> Number (format not defined - see Zipios docs)
// ZipEntry#isValid? -> Boolean
// ZipEntry#isDirectory? -> Boolean
// ZipEntry#path
// ZipEntry#filename
//
// BUGS/TODO
//
// - Fix ZipEntry#entry coredump
// - Utility to create embedded Zipfiles
// - Convert ZipEntry#time to Ruby date
// - ZipStream support (code removed until I work out how to fix)
// - Use Ruby IO object in ZipFile#new (may need complete rewrite)
//
// On reflection it might have been easier to write simple C
// extension supporting the Zip file structure and reuse the Ruby
// Zlib module for decompression
//
// LICENSE
//
// The zipios++ library is released under the GNU LGPL
// (http://www.gnu.org/copyleft/lesser.html)
//
// Ruby is releaed under a combined GPL/Artistic lisence
// (http://www.ruby-lang.org/en/LICENSE.txt)
//
// This code is freely distributable under whatever the combined
// restrictions of the two above licenses might be
//
// Author: Paul Charvavarti (paul_c@passtheaardvark.com)
//
// $Id: zip.cpp,v 1.1.1.1 2001/03/13 17:43:52 paulc Exp $
//
// $Log: zip.cpp,v $
// Revision 1.1.1.1 2001/03/13 17:43:52 paulc
// Initial Import
//
//
extern "C" {
#include "ruby.h"
}
#include "zipios++/zipfile.h"
#include "zipios++/zipinputstream.h"
#include "zipios++/ziphead.h"
//
// C++ object wrapper macros stolen from SWIG
//
#define VALUEFUNC(f) ((VALUE (*)(...))f)
#define VOIDFUNC(f) ((void (*)(...))f)
#define Wrap_Class(klass,mark,free,ptr) \
((ptr)?Data_Wrap_Struct(klass,VOIDFUNC(mark),VOIDFUNC(free),ptr):Qnil)
#define Get_Class(val,rtype,ctype,ptr) {\
if (NIL_P(val)) ptr = NULL;\
else {\
if (!rb_obj_is_kind_of(val, rtype))\
rb_raise(rb_eTypeError, "Wrong argument type");\
Data_Get_Struct(val, ctype, ptr);\
if (!ptr) rb_raise(rb_eRuntimeError, "Class already released");\
}\
}
#define Wrap_ZipFile(klass,ptr) \
Wrap_Class(klass,0,free_ZipFile,ptr)
#define Get_ZipFile(val,ptr) \
Get_Class(val,cZipFile,ZipFile,ptr)
#define Wrap_ZipLocalEntry(klass,ptr) \
Wrap_Class(klass,0,free_ZipLocalEntry,ptr)
#define Get_ZipLocalEntry(val,ptr) \
Get_Class(val,cZipLocalEntry,ZipLocalEntry,ptr)
//
// Debug macros - compile with -DDEBUG to enable
//
#define VALUE2STR(value) STR2CSTR(rb_funcall(value,rb_intern("to_s"),0))
#ifdef DEBUG
#define DEBUG_MSG(msg) printf ( " (%s:%d) MSG: %s\n", \
__FILE__, __LINE__, msg ) ;
#define DEBUG_NUM(msg,num) printf ( " (%s:%d) NUM: %s ->%d\n", \
__FILE__, __LINE__, msg, num ) ;
#define DEBUG_STR(msg,str) printf ( " (%s:%d) NUM: %s ->%s\n", \
__FILE__, __LINE__, msg, str) ;
#define DEBUG_PTR(msg,ptr) printf ( " (%s:%d) PTR: %s ->%d\n", \
__FILE__, __LINE__, msg,ptr ) ;
#define DEBUG_VALUE(msg,value) printf ( " (%s:%d) VALUE: %s -> %s\n", \
__FILE__, __LINE__, msg, \
VALUE2STR(rb_funcall(value,rb_intern("inspect"),0)))
#define DEBUG_METHOD(msg,value,method) printf ( " (%s:%d) METHOD: %s ->
%s\n", \
__FILE__, __LINE__, msg, \
VALUE2STR(rb_funcall(value,rb_intern(#method),0)))
#else
#define DEBUG_MSG(msg) ;
#define DEBUG_NUM(msg,num) ;
#define DEBUG_NUM(msg,str) ;
#define DEBUG_PTR(msg,ptr) ;
#define DEBUG_VALUE(msg,value) ;
#define DEBUG_METHOD(msg,value,method) ;
#endif
//
// C++ Namespace
//
using namespace zipios ;
//
// Function prototypes
//
static VALUE ZipLocalEntry_inspect ( VALUE self ) ;
static VALUE ZipLocalEntry_getProperties ( VALUE rbZipLocalEntry ) ;
VALUE ZipLocalEntry_new ( ConstEntryPointer *entry ) ;
static VALUE getDataFromInputStream ( istream *is, int length ) ;
static VALUE ZipFile_getData ( VALUE self, VALUE name ) ;
static VALUE ZipFile_entry ( VALUE self, VALUE name ) ;
static VALUE ZipFile_entries ( VALUE self ) ;
static VALUE ZipFile_inspect ( VALUE self ) ;
VALUE ZipFile_embedded ( VALUE self, VALUE filename ) ;
VALUE ZipFile_new ( int argc, VALUE *argv, VALUE self ) ;
//
// Global Types
//
VALUE mZip;
VALUE cZipFile;
VALUE cZipLocalEntry;
//
// Object 'free' functions used by Data_Wrap_Struct
//
void free_ZipFile(ZipFile *arg) { delete arg ; }
void free_ZipLocalEntry(ZipLocalEntry *arg) { delete arg ; }
//
// ZipEntry#inspect
//
static VALUE ZipLocalEntry_inspect ( VALUE self ) {
char *buffer ;
buffer = ALLOCA_N ( char, 1024 ) ;
snprintf ( buffer, 1024, "#<Zip::ZipEntry:0x%lx @path=\"%s\">",
self, STR2CSTR(rb_iv_get(self, "@path") )) ;
return rb_str_new2(buffer) ;
}
//
// ZipEntry#getProperties
//
// Extract properties from ZipLocalEntry abd write to instance vars
// Method not exposed ro Runy (called by ZipLocalEntry_new)
//
static VALUE ZipLocalEntry_getProperties ( VALUE rbZipLocalEntry ) {
ZipLocalEntry *zipLocalEntry ;
Get_ZipLocalEntry ( rbZipLocalEntry, zipLocalEntry ) ;
rb_iv_set ( rbZipLocalEntry, "@comment",
rb_str_new2(zipLocalEntry->getComment().c_str()) ) ;
rb_iv_set ( rbZipLocalEntry, "@compressed_size",
INT2NUM(zipLocalEntry->getCompressedSize()) ) ;
rb_iv_set ( rbZipLocalEntry, "@crc",
INT2NUM(zipLocalEntry->getCrc()) ) ;
rb_iv_set ( rbZipLocalEntry, "@size",
INT2NUM(zipLocalEntry->getSize()) ) ;
rb_iv_set ( rbZipLocalEntry, "@time",
INT2NUM(zipLocalEntry->getTime()) ) ;
rb_iv_set ( rbZipLocalEntry, "@isValid",
zipLocalEntry->isValid() ? Qtrue : Qfalse ) ;
rb_iv_set ( rbZipLocalEntry, "@isDirectory",
zipLocalEntry->isDirectory() ? Qtrue : Qfalse ) ;
rb_iv_set ( rbZipLocalEntry, "@path",
rb_str_new2(zipLocalEntry->getName().c_str()) ) ;
rb_iv_set ( rbZipLocalEntry, "@filename",
rb_str_new2(zipLocalEntry->getFileName().c_str()) ) ;
return rbZipLocalEntry ;
}
//
// ZipEntry constructor
//
// Passed ConstEntryPointer to C++ ZipLocalEntry object
//
VALUE ZipLocalEntry_new ( ConstEntryPointer *entry ) {
VALUE rbZipLocalEntry = Qnil ;
ZipLocalEntry *zipLocalEntry ;
DEBUG_MSG("Entering Function #ZipLocalEntry_new") ;
DEBUG_PTR("ConstEntryPointer",entry) ;
zipLocalEntry = (ZipLocalEntry *) (*entry)->clone() ;
DEBUG_PTR("zipLocalEntry",zipLocalEntry) ;
rbZipLocalEntry = Wrap_ZipLocalEntry ( cZipLocalEntry, zipLocalEntry )
;
ZipLocalEntry_getProperties ( rbZipLocalEntry ) ;
DEBUG_VALUE("rbZipLocalEntry",rbZipLocalEntry) ;
DEBUG_MSG("Leaving Function #ZipLocalEntry_new") ;
return rbZipLocalEntry ;
}
//
// Extract ZipEntry contents to Ruby string
//
static VALUE getDataFromInputStream ( istream *is, int length ) {
VALUE data ;
char *buffer ;
DEBUG_MSG("Entering Function getDataFromInputStream") ;
DEBUG_PTR("Istream",is) ;
DEBUG_NUM("Length",length) ;
if ( (buffer = (char *) calloc(length,sizeof(char))) == NULL ) {
rb_raise ( rb_eRuntimeError, "could not allocate buffery memory" ) ;
}
try {
is->read ( buffer,length ) ;
}
catch ( exception &excp ) {
rb_raise ( rb_eRuntimeError, excp.what() ) ;
}
data = rb_str_new ( buffer, length ) ;
DEBUG_METHOD("Got Buffer Length",data,length) ;
DEBUG_MSG("Leaving Function getDataFromInputStream") ;
return data ;
}
//
// ZipFile#GetData
//
// Extract uncompressed data for entry 'name' - 'name' can either be a
// ZipEntry value or an explicit path
//
// Calls getDataFromInputStream to extract data
//
static VALUE ZipFile_getData ( VALUE self, VALUE entry ) {
VALUE rbZipEntry ;
ZipFile *zf ;
istream *is ;
ZipLocalEntry *zipentry ;
string s_name ;
DEBUG_MSG("Entering Function #ZipFile_getData") ;
DEBUG_VALUE("self",self);
DEBUG_VALUE("entry",entry);
Get_ZipFile ( self, zf ) ;
DEBUG_PTR("ZipFile",zf) ;
try {
if ( TYPE(entry) == T_STRING ) {
rbZipEntry = ZipFile_entry ( self, entry) ;
s_name = STR2CSTR(entry) ;
}
else if ( rb_obj_is_kind_of(entry,cZipLocalEntry) ) {
rbZipEntry = entry ;
s_name = STR2CSTR(rb_funcall(entry,rb_intern("path"),0)) ;
}
else {
rb_raise ( rb_eTypeError, "Must be String or ZipEntry" ) ;
}
DEBUG_PTR("RbZipEntry",rbZipEntry) ;
Get_ZipLocalEntry ( rbZipEntry, zipentry ) ;
DEBUG_PTR("ZipEntry",zipentry) ;
if ( zipentry->isDirectory() ) {
rb_raise ( rb_eRuntimeError, "Entry is directory" ) ;
}
if ( ( is = zf->getInputStream(s_name)) == 0 ) {
rb_raise ( rb_eRuntimeError, "Could not get istream" ) ;
}
DEBUG_PTR("Istream",is) ;
return getDataFromInputStream ( is, zipentry->getSize() ) ;
}
catch ( exception &excp ) {
rb_raise ( rb_eRuntimeError, excp.what() ) ;
}
}
//
// ZipFile#entry
//
// Creates ZipEntry object for given entry name
//
static VALUE ZipFile_entry ( VALUE self, VALUE name ) {
VALUE zipLocalEntry = Qnil ;
ConstEntryPointer entry ;
ConstEntryPointer *ptr_entry ;
ZipFile *zf ;
const string sname = STR2CSTR(name) ;
DEBUG_MSG("Entering Function #ZipFile_entry") ;
DEBUG_VALUE("self",self) ;
Get_ZipFile ( self, zf ) ;
DEBUG_PTR("ZipFile",zf) ;
try {
if ( (entry = zf->getEntry(sname)) == 0 ) {
DEBUG_MSG("GetEntry Failed") ;
rb_raise ( rb_eRuntimeError, "Entry not found" ) ;
}
else {
DEBUG_MSG("GetEntry OK") ;
ptr_entry = new ConstEntryPointer ( entry ) ;
DEBUG_PTR("ConstEntryPointer",ptr_entry) ;
zipLocalEntry = ZipLocalEntry_new ( ptr_entry ) ;
DEBUG_VALUE("zipLocalEntry",zipLocalEntry) ;
DEBUG_MSG("Leaving Function #ZipFile_entry") ;
return zipLocalEntry ;
}
}
catch ( exception &excp ) {
DEBUG_MSG("Exception") ;
rb_raise ( rb_eRuntimeError, excp.what() ) ;
}
}
//
// ZipFile#entries
//
// Creates either list of ZipEntry objects (ZipFile contents) or
// in block context calls block once for each entry passing
// ZipEntry object
//
static VALUE ZipFile_entries ( VALUE self ) {
VALUE entries_ary ;
vector< ConstEntryPointer > entries ;
vector< ConstEntryPointer >::iterator it ;
ZipFile *zf ;
Get_ZipFile ( self, zf ) ;
try {
entries = zf->entries() ;
}
catch ( exception &excp ) {
rb_raise ( rb_eRuntimeError, excp.what() ) ;
}
if ( rb_block_given_p() ) {
for( it = entries.begin() ; it != entries.end() ; it++) {
rb_yield ( ZipLocalEntry_new(it) ) ;
}
return self ;
}
else {
entries_ary = rb_ary_new () ;
for( it = entries.begin() ; it != entries.end() ; it++) {
rb_ary_push ( entries_ary, ZipLocalEntry_new(it) ) ;
}
return entries_ary ;
}
}
//
// ZipFile#size
//
// Returns number of elements in Zipfile
//
//
// static VALUE ZipFile_size ( VALUE self ) {
//
// ZipFile *zf ;
// Get_ZipFile ( self, zf ) ;
// return INT2FIX(zf->size()) ;
// }
//
//
// ZipFile#getName
//
// Returns archive name
//
//
// static VALUE ZipFile_getName ( VALUE self ) {
//
// ZipFile *zf ;
// Get_ZipFile ( self, zf ) ;
// return rb_str_new2(zf->getName().c_str()) ;
// }
//
// ZipFile#inspect
//
static VALUE ZipFile_inspect ( VALUE self ) {
char *buffer ;
buffer = ALLOCA_N ( char, 1024 ) ;
snprintf ( buffer, 1024, "#<Zip::ZipFile:0x%lx @name=\"%s\">",
self, STR2CSTR(rb_iv_get(self, "@name") )) ;
return rb_str_new2(buffer) ;
}
//
// ZipFile#openEmbeddedZipFile
//
// Opens embedded zip file generated according to format in
// zipio++ package (offset stored in last 4 bytes of file)
//
VALUE ZipFile_embedded ( VALUE self, VALUE filename ) {
ZipFile *zipFile, embeddedZipFile ;
VALUE rbZipFile = Qnil ;
VALUE stat ;
stat = rb_eval_string ( "File" ) ;
if ( rb_funcall(stat,rb_intern("readable?"),1,filename) == Qfalse ) {
rb_raise ( rb_eRuntimeError, "Could not open file \"%s\"",
STR2CSTR(filename) ) ;
}
try {
embeddedZipFile = ZipFile::openEmbeddedZipFile(STR2CSTR(filename)) ;
zipFile = new ZipFile ( embeddedZipFile ) ;
}
catch ( exception &excp ) {
rb_raise ( rb_eRuntimeError, excp.what() ) ;
}
rbZipFile = Wrap_ZipFile ( self, zipFile ) ;
return rbZipFile ;
}
//
// ZipFile#new (constructor)
//
//
VALUE ZipFile_new ( int argc, VALUE *argv, VALUE self ) {
ZipFile zipFile ;
ZipFile *zipFilePtr ;
VALUE rbZipFile = Qnil ;
VALUE stat = Qnil ;
VALUE filename = Qnil ;
VALUE offset = Qnil ;
int c_offset = 0 ;
rb_scan_args ( argc, argv, "11", &filename, &offset ) ;
c_offset = ( offset == Qnil ) ? 0 : NUM2INT(offset) ;
// We have to check the file exists befoew we pass on to the zipios
// constuctor as it does not generate an expection on error
stat = rb_eval_string ( "File" ) ; // Must be a better way to do this
if ( rb_funcall(stat,rb_intern("readable?"),1,filename) == Qfalse ) {
rb_raise ( rb_eRuntimeError, "Could not open file \"%s\"",
STR2CSTR(filename) ) ;
}
try {
zipFile = ZipFile (STR2CSTR(filename), c_offset) ;
}
catch ( exception &excp ) {
rb_raise ( rb_eRuntimeError, excp.what() ) ;
}
// Allocate object on heap once local object successfully created
// (Seems to prevents memory leak in exception handler)
zipFilePtr = new ZipFile( zipFile ) ;
rbZipFile = Wrap_ZipFile ( self, zipFilePtr ) ;
rb_iv_set ( rbZipFile, "@name",
rb_str_new2(zipFilePtr->getName().c_str()) ) ;
rb_iv_set ( rbZipFile, "@items", INT2FIX(zipFilePtr->size()) ) ;
return rbZipFile ;
}
//
// Define methids to Ruby
//
extern "C"
void Init_Zip() {
mZip = rb_define_module ( "Zip" ) ;
// ZipFile
cZipFile = rb_define_class_under ( mZip, "ZipFile", rb_cObject ) ;
rb_define_singleton_method ( cZipFile, "new", ZipFile_new, -1 ) ;
rb_define_singleton_method ( cZipFile, "openEmbeddedZipFile",
ZipFile_embedded, 1 ) ;
rb_define_method ( cZipFile, "inspect", ZipFile_inspect, 0 ) ;
rb_define_method ( cZipFile, "entries", ZipFile_entries, 0 ) ;
rb_define_method ( cZipFile, "entry", ZipFile_entry, 1 ) ;
rb_define_method ( cZipFile, "getData", ZipFile_getData, 1 ) ;
rb_define_attr ( cZipFile, "name", 1, 0 ) ;
rb_define_attr ( cZipFile, "items", 1, 0 ) ;
// ZipEntry
cZipLocalEntry = rb_define_class_under ( mZip, "ZipEntry", rb_cObject )
;
rb_define_method ( cZipLocalEntry, "inspect", ZipLocalEntry_inspect, 0 )
;
rb_define_attr ( cZipLocalEntry, "comment", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "compressed_size", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "crc", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "size", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "time", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "isValid?", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "isDirectory?", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "path", 1, 0 ) ;
rb_define_attr ( cZipLocalEntry, "filename", 1, 0 ) ;
}