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