]>
cygwin.com Git - cygwin-apps/setup.git/blob - compress_bz.cc
2 * Copyright (c) 2001, Robert Collins.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by Robert Collins <rbtcollins@hotmail.com>
16 /* Archive IO operations for bz2 files.
17 derived from the fd convenience functions in the libbz2 package.
21 static const char *cvsid
=
32 #include "io_stream.h"
34 #include "compress_bz.h"
36 compress_bz::compress_bz (io_stream
* parent
) : peeklen (0), position (0)
38 /* read only via this constructor */
41 if (!parent
|| parent
->error ())
54 int ret
= BZ2_bzDecompressInit (&(strm
), 0, 0);
66 compress_bz::read (void *buffer
, size_t len
)
68 if (!initialisedOk
|| writing
)
75 ssize_t tmplen
= std::min (peeklen
, len
);
77 memcpy (buffer
, peekbuf
, tmplen
);
78 memmove (peekbuf
, peekbuf
+ tmplen
, tmplen
);
79 ssize_t tmpread
= read (&((char *) buffer
)[tmplen
], len
- tmplen
);
81 return tmpread
+ tmplen
;
87 strm
.next_out
= (char *) buffer
;
92 if (original
->error ())
94 lasterr
= original
->error ();
97 if (strm
.avail_in
== 0 && rlen
> 0)
99 rlen
= original
->read (buf
, 4096);
102 if (original
->error())
103 lasterr
= original
->error();
109 strm
.avail_in
= rlen
;
113 ret
= BZ2_bzDecompress (&strm
);
114 if (ret
!= BZ_OK
&& ret
!= BZ_STREAM_END
)
119 if (ret
== BZ_OK
&& rlen
== 0 && strm
.avail_out
)
121 /* unexpected end of file */
125 if (ret
== BZ_STREAM_END
)
127 position
+= len
- strm
.avail_out
;
128 return len
- strm
.avail_out
;
130 if (strm
.avail_out
== 0)
141 ssize_t
compress_bz::write (const void *buffer
, size_t len
)
143 log (LOG_TIMESTAMP
, "compress_bz::write called");
147 ssize_t
compress_bz::peek (void *buffer
, size_t len
)
154 /* can only peek 512 bytes */
160 size_t want
= len
- peeklen
;
161 ssize_t got
= read (&peekbuf
[peeklen
], want
);
167 /* we may have read less than requested. */
168 memcpy (buffer
, peekbuf
, peeklen
);
173 memcpy (buffer
, peekbuf
, len
);
184 log (LOG_TIMESTAMP
, "compress_bz::tell called for writing mode");
191 compress_bz::seek (long where
, io_stream_seek_t whence
)
193 log (LOG_TIMESTAMP
, "compress_bz::seek called");
198 compress_bz::error ()
204 compress_bz::set_mtime (int time
)
207 return original
->set_mtime (time
);
212 compress_bz::get_mtime ()
215 return original
->get_mtime ();
219 compress_bz::~compress_bz ()
222 BZ2_bzDecompressEnd (&strm
);
This page took 0.046736 seconds and 5 git commands to generate.