aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/bunzip.c21
-rw-r--r--toys/bzcat.c14
-rw-r--r--toys/toylist.h1
3 files changed, 26 insertions, 10 deletions
diff --git a/lib/bunzip.c b/lib/bunzip.c
index 9116a877..fbc6c8e4 100644
--- a/lib/bunzip.c
+++ b/lib/bunzip.c
@@ -3,10 +3,11 @@
Copyright 2003, 2006 by Rob Landley (rob@landley.net).
- Based on a close reading (but not the actual code) of bzip2 decompression
- code by Julian R Seward (jseward@acm.org), which also acknowledges
- contributions by Mike Burrows, David Wheeler, Peter Fenwick, Alistair
- Moffat, Radford Neal, Ian H. Witten, Robert Sedgewick, and Jon L. Bentley.
+ Based on a close reading (but not the actual code) of the original bzip2
+ decompression code by Julian R Seward (jseward@acm.org), which also
+ acknowledges contributions by Mike Burrows, David Wheeler, Peter Fenwick,
+ Alistair Moffat, Radford Neal, Ian H. Witten, Robert Sedgewick, and
+ Jon L. Bentley.
*/
#include "toys.h"
@@ -117,7 +118,7 @@ static unsigned int get_bits(bunzip_data *bd, char bits_wanted)
}
// Decompress a block of text to into intermediate buffer
-extern int read_bunzip_data(bunzip_data *bd)
+int read_bunzip_data(bunzip_data *bd)
{
struct group_data *hufGroup;
int dbufCount, nextSym, dbufSize, origPtr, groupCount, *base, *limit,
@@ -195,7 +196,7 @@ extern int read_bunzip_data(bunzip_data *bd)
t = get_bits(bd, 5);
for (i = 0; i < symCount; i++) {
for(;;) {
- if (t < 1 || t > MAX_HUFCODE_BITS) return RETVAL_DATA_ERROR;
+ if (MAX_HUFCODE_BITS < (unsigned)t-1) return RETVAL_DATA_ERROR;
if(!get_bits(bd, 1)) break;
if(!get_bits(bd, 1)) t++;
else t--;
@@ -397,7 +398,7 @@ extern int read_bunzip_data(bunzip_data *bd)
}
// Flush output buffer to disk
-extern void flush_bunzip_outbuf(bunzip_data *bd, int out_fd)
+void flush_bunzip_outbuf(bunzip_data *bd, int out_fd)
{
if (bd->outbufPos) {
if (write(out_fd, bd->outbuf, bd->outbufPos) != bd->outbufPos)
@@ -409,7 +410,7 @@ extern void flush_bunzip_outbuf(bunzip_data *bd, int out_fd)
// Undo burrows-wheeler transform on intermediate buffer to produce output.
// If !len, write up to len bytes of data to buf. Otherwise write to out_fd.
// Returns len ? bytes written : RETVAL_OK. Notice all errors negative #'s.
-extern int write_bunzip_data(bunzip_data *bd, int out_fd, char *outbuf, int len)
+int write_bunzip_data(bunzip_data *bd, int out_fd, char *outbuf, int len)
{
unsigned int *dbuf = bd->dbuf;
int count, pos, current, run, copies, outbyte, previous, gotcount = 0;
@@ -503,7 +504,7 @@ dataus_interruptus:
// Allocate the structure, read file header. If !len, src_fd contains
// filehandle to read from. Else inbuf contains data.
-extern int start_bunzip(bunzip_data **bdp, int src_fd, char *inbuf, int len)
+int start_bunzip(bunzip_data **bdp, int src_fd, char *inbuf, int len)
{
bunzip_data *bd;
unsigned int i, j, c;
@@ -553,7 +554,7 @@ extern int start_bunzip(bunzip_data **bdp, int src_fd, char *inbuf, int len)
// Example usage: decompress src_fd to dst_fd. (Stops at end of bzip data,
// not end of file.)
-extern char *uncompressStream(int src_fd, int dst_fd)
+char *bunzipStream(int src_fd, int dst_fd)
{
bunzip_data *bd;
int i;
diff --git a/toys/bzcat.c b/toys/bzcat.c
new file mode 100644
index 00000000..30437bb8
--- /dev/null
+++ b/toys/bzcat.c
@@ -0,0 +1,14 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * bzcat.c - decompress stdin to stdout using bunzip2.
+ */
+
+#include "toys.h"
+
+int bzcat_main(void)
+{
+ char *error = bunzipStream(0, 1);
+
+ if (error) error_exit(error);
+ return 0;
+}
diff --git a/toys/toylist.h b/toys/toylist.h
index 258df47f..2f95232f 100644
--- a/toys/toylist.h
+++ b/toys/toylist.h
@@ -67,6 +67,7 @@ NEWTOY(toybox, NULL, 0)
// The rest of these are alphabetical, for binary search.
+USE_BZCAT(NEWTOY(bzcat, "", TOYFLAG_USR|TOYFLAG_BIN))
USE_CATV(NEWTOY(catv, "vte", TOYFLAG_NOFORK|TOYFLAG_USR|TOYFLAG_BIN))
USE_TOYSH(NEWTOY(cd, NULL, TOYFLAG_NOFORK))
USE_DF(NEWTOY(df, "Pkt*a", TOYFLAG_USR|TOYFLAG_SBIN))