On 09-01-2017 09:08:22 +0100, Jan Stary wrote: > The particular problem I am having is that http://mdocml.bsd.lv/ , > my manpage formatter of choice, does deliberately not support bzip > (or any other outside decompressors for that matter).
Attached patch works for me. XZ should be a similar exercise, a little cleanup would be nice then though. Fabian -- Fabian Groffen Gentoo on a different level
--- mdocml-1.13.4/read.c
+++ mdocml-1.13.4/read.c
@@ -38,6 +38,7 @@
#include <string.h>
#include <unistd.h>
#include <zlib.h>
+#include <bzlib.h>
#include "mandoc_aux.h"
#include "mandoc.h"
@@ -62,6 +62,7 @@
enum mandoclevel wlevel; /* ignore messages below this */
int options; /* parser options */
int gzip; /* current input file is gzipped */
+ int bzip; /* current input file is bzipp2ed */
int filenc; /* encoding of the current file */
int reparse_count; /* finite interp. stack */
int line; /* line number in the file */
@@ -610,6 +611,7 @@
struct buf *fb, int *with_mmap)
{
gzFile gz;
+ BZFILE *bz;
size_t off;
ssize_t ssz;
@@ -629,7 +629,7 @@
* concerned that this is going to tank any machines.
*/
- if (curp->gzip == 0 && S_ISREG(st.st_mode)) {
+ if (curp->gzip == 0 && curp->bzip == 0 && S_ISREG(st.st_mode)) {
if (st.st_size > 0x7fffffff) {
mandoc_msg(MANDOCERR_TOOLARGE, curp, 0, 0, NULL);
return 0;
@@ -639,11 +641,15 @@
}
#endif
+ gz = NULL;
+ bz = NULL;
if (curp->gzip) {
if ((gz = gzdopen(fd, "rb")) == NULL)
err((int)MANDOCLEVEL_SYSERR, "%s", file);
- } else
- gz = NULL;
+ } else if (curp->bzip) {
+ if ((bz = BZ2_bzdopen(fd, "rb")) == NULL)
+ err((int)MANDOCLEVEL_SYSERR, "%s", file);
+ }
/*
* If this isn't a regular file (like, say, stdin), then we must
@@ -663,9 +669,13 @@
}
resize_buf(fb, 65536);
}
- ssz = curp->gzip ?
- gzread(gz, fb->buf + (int)off, fb->sz - off) :
- read(fd, fb->buf + (int)off, fb->sz - off);
+ if (curp->gzip) {
+ ssz = gzread(gz, fb->buf + (int)off, fb->sz - off);
+ } else if (curp->bzip) {
+ ssz = BZ2_bzread(bz, fb->buf + (int)off, fb->sz - off);
+ } else {
+ ssz = read(fd, fb->buf + (int)off, fb->sz - off);
+ }
if (ssz == 0) {
fb->sz = off;
return 1;
@@ -785,6 +795,7 @@
curp->file = file;
cp = strrchr(file, '.');
curp->gzip = (cp != NULL && ! strcmp(cp + 1, "gz"));
+ curp->bzip = (cp != NULL && ! strcmp(cp + 1, "bz2"));
/* First try to use the filename as it is. */
@@ -804,6 +815,13 @@
curp->gzip = 1;
return fd;
}
+ mandoc_asprintf(&cp, "%s.bz2", file);
+ fd = open(cp, O_RDONLY);
+ free(cp);
+ if (fd != -1) {
+ curp->bzip = 1;
+ return fd;
+ }
}
/* Neither worked, give up. */
--- mdocml-1.13.4/configure
+++ mdocml-1.13.4/configure
@@ -255,7 +255,7 @@
fi
# --- LDADD ---
-LDADD="${LDADD} ${LD_SQLITE3} ${LD_OHASH} -lz"
+LDADD="${LDADD} ${LD_SQLITE3} ${LD_OHASH} -lz -lbz2"
echo "LDADD=\"${LDADD}\"" 1>&2
echo "LDADD=\"${LDADD}\"" 1>&3
echo 1>&3
signature.asc
Description: Digital signature
