From owner-svn-src-user@FreeBSD.ORG Mon Aug 29 20:36:22 2011 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 01DAB10656B8; Mon, 29 Aug 2011 20:36:22 +0000 (UTC) (envelope-from gabor@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E63848FC12; Mon, 29 Aug 2011 20:36:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p7TKaLmk011692; Mon, 29 Aug 2011 20:36:21 GMT (envelope-from gabor@svn.freebsd.org) Received: (from gabor@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7TKaLgL011686; Mon, 29 Aug 2011 20:36:21 GMT (envelope-from gabor@svn.freebsd.org) Message-Id: <201108292036.p7TKaLgL011686@svn.freebsd.org> From: Gabor Kovesdan Date: Mon, 29 Aug 2011 20:36:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r225251 - user/gabor/grep/trunk X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Aug 2011 20:36:22 -0000 Author: gabor Date: Mon Aug 29 20:36:21 2011 New Revision: 225251 URL: http://svn.freebsd.org/changeset/base/225251 Log: - Add support for xz[ef]?grep (1) and lz[ef]?grep. The former handles xz(1) compressed files and the latter lzma(1) compressed files. The -X and -M command-line options can also be used respectively. Suggested by: naddy (1) Modified: user/gabor/grep/trunk/Makefile user/gabor/grep/trunk/file.c user/gabor/grep/trunk/grep.1 user/gabor/grep/trunk/grep.c user/gabor/grep/trunk/grep.h Modified: user/gabor/grep/trunk/Makefile ============================================================================== --- user/gabor/grep/trunk/Makefile Mon Aug 29 20:00:57 2011 (r225250) +++ user/gabor/grep/trunk/Makefile Mon Aug 29 20:36:21 2011 (r225251) @@ -28,7 +28,13 @@ LINKS= ${BINDIR}/grep ${BINDIR}/egrep \ ${BINDIR}/grep ${BINDIR}/zfgrep \ ${BINDIR}/grep ${BINDIR}/bzgrep \ ${BINDIR}/grep ${BINDIR}/bzegrep \ - ${BINDIR}/grep ${BINDIR}/bzfgrep + ${BINDIR}/grep ${BINDIR}/bzfgrep \ + ${BINDIR}/grep ${BINDIR}/xzgrep \ + ${BINDIR}/grep ${BINDIR}/xzefgrep \ + ${BINDIR}/grep ${BINDIR}/xzfgrep \ + ${BINDIR}/grep ${BINDIR}/lzgrep \ + ${BINDIR}/grep ${BINDIR}/lzegrep \ + ${BINDIR}/grep ${BINDIR}/lzfgrep MLINKS= grep.1 egrep.1 \ grep.1 fgrep.1 \ @@ -37,11 +43,17 @@ MLINKS= grep.1 egrep.1 \ grep.1 zfgrep.1 \ grep.1 bzgrep.1 \ grep.1 bzegrep.1 \ - grep.1 bzfgrep.1 + grep.1 bzfgrep.1 \ + grep.1 xzgrep.1 \ + grep.1 xzegrep.1 \ + grep.1 xzfgrep.1 \ + grep.1 lzgrep.1 \ + grep.1 lzegrep.1 \ + grep.1 lzfgrep.1 .endif -LDADD= -lz -lbz2 -DPADD= ${LIBZ} ${LIBBZ2} +LDADD= -lz -lbz2 -llzma +DPADD= ${LIBZ} ${LIBBZ2} ${LIBLZMA} .if !defined(WITHOUT_GNU_COMPAT) CFLAGS+= -I/usr/include/gnu Modified: user/gabor/grep/trunk/file.c ============================================================================== --- user/gabor/grep/trunk/file.c Mon Aug 29 20:00:57 2011 (r225250) +++ user/gabor/grep/trunk/file.c Mon Aug 29 20:36:21 2011 (r225251) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -56,6 +57,7 @@ __FBSDID("$FreeBSD$"); static gzFile gzbufdesc; static BZFILE* bzbufdesc; +static lzma_stream lstrm = LZMA_STREAM_INIT; static unsigned char buffer[MAXBUFSIZ]; static unsigned char *bufpos; @@ -101,6 +103,35 @@ grep_refill(struct file *f) /* Make sure we exit with an error */ nr = -1; } + } else if ((filebehave == FILE_XZ) || (filebehave == FILE_LZMA)) { + lzma_action action = LZMA_RUN; + uint8_t in_buf[MAXBUFSIZ]; + lzma_ret ret; + + ret = (filebehave == FILE_XZ) ? + lzma_stream_decoder(&lstrm, UINT64_MAX, + LZMA_CONCATENATED) : + lzma_alone_decoder(&lstrm, UINT64_MAX); + + if (ret != LZMA_OK) + return (-1); + + lstrm.next_out = buffer; + lstrm.avail_out = MAXBUFSIZ; + lstrm.next_in = in_buf; + lstrm.avail_in = read(f->fd, in_buf, MAXBUFSIZ); + + if (lstrm.avail_in < 0) + return (-1); + else if (lstrm.avail_in == 0) + action = LZMA_FINISH; + + ret = lzma_code(&lstrm, action); + + if (ret != LZMA_OK && ret != LZMA_STREAM_END) + return (-1); + bufrem = MAXBUFSIZ - lstrm.avail_out; + return (0); } else nr = read(f->fd, buffer, MAXBUFSIZ); Modified: user/gabor/grep/trunk/grep.1 ============================================================================== --- user/gabor/grep/trunk/grep.1 Mon Aug 29 20:00:57 2011 (r225250) +++ user/gabor/grep/trunk/grep.1 Mon Aug 29 20:36:21 2011 (r225251) @@ -30,13 +30,15 @@ .\" .\" @(#)grep.1 8.3 (Berkeley) 4/18/94 .\" -.Dd July 28, 2010 +.Dd August 29, 2011 .Dt GREP 1 .Os .Sh NAME .Nm grep , egrep , fgrep , .Nm zgrep , zegrep , zfgrep , .Nm bzgrep , bzegrep , bzfgrep +.Nm xzgrep , xzegrep , xzfgrep +.Nm lzgrep , lzegrep , lzfgrep .Nd file pattern searcher .Sh SYNOPSIS .Nm grep @@ -117,6 +119,32 @@ respectively, but accept input files com .Xr bzip2 1 compression utility. .Pp +.Nm xzgrep , +.Nm xzegrep , +and +.Nm xzfgrep +act like +.Nm grep , +.Nm egrep , +and +.Nm fgrep , +respectively, but accept input files compressed with the +.Xr xz 1 +compression utility. +.Pp +.Nm lzgrep , +.Nm lzegrep , +and +.Nm lzfgrep +act like +.Nm grep , +.Nm egrep , +and +.Nm fgrep , +respectively, but accept input files compressed with the +.Xr lzma 1 +compression utility. +.Pp The following options are available: .Bl -tag -width indent .It Fl A Ar num , Fl Fl after-context Ns = Ns Ar num Modified: user/gabor/grep/trunk/grep.c ============================================================================== --- user/gabor/grep/trunk/grep.c Mon Aug 29 20:00:57 2011 (r225250) +++ user/gabor/grep/trunk/grep.c Mon Aug 29 20:36:21 2011 (r225251) @@ -165,7 +165,7 @@ usage(void) exit(2); } -static const char *optstr = "0123456789A:B:C:D:EFGHIJLOPSRUVZabcd:e:f:hilm:nopqrsuvwxy"; +static const char *optstr = "0123456789A:B:C:D:EFGHIJMLOPSRUVZabcd:e:f:hilm:nopqrsuvwxXy"; struct option long_options[] = { @@ -201,6 +201,7 @@ struct option long_options[] = {"files-with-matches", no_argument, NULL, 'l'}, {"files-without-match", no_argument, NULL, 'L'}, {"max-count", required_argument, NULL, 'm'}, + {"lzma", no_argument, NULL, 'M'}, {"line-number", no_argument, NULL, 'n'}, {"only-matching", no_argument, NULL, 'o'}, {"quiet", no_argument, NULL, 'q'}, @@ -213,6 +214,7 @@ struct option long_options[] = {"version", no_argument, NULL, 'V'}, {"word-regexp", no_argument, NULL, 'w'}, {"line-regexp", no_argument, NULL, 'x'}, + {"xz", no_argument, NULL, 'X'}, {"decompress", no_argument, NULL, 'Z'}, {NULL, no_argument, NULL, 0} }; @@ -331,6 +333,12 @@ main(int argc, char *argv[]) if (pn[0] == 'b' && pn[1] == 'z') { filebehave = FILE_BZIP; pn += 2; + } else if (pn[0] == 'x' && pn[1] == 'z') { + filebehave = FILE_XZ; + pn += 2; + } else if (pn[0] == 'l' && pn[1] == 'z') { + filebehave = FILE_LZMA; + pn += 2; } else if (pn[0] == 'z') { filebehave = FILE_GZIP; pn += 1; @@ -505,6 +513,9 @@ main(int argc, char *argv[]) err(2, NULL); } break; + case 'M': + filebehave = FILE_LZMA; + break; case 'n': nflag = true; break; @@ -553,6 +564,9 @@ main(int argc, char *argv[]) xflag = true; cflags &= ~REG_NOSUB; break; + case 'X': + filebehave = FILE_XZ; + break; case 'Z': filebehave = FILE_GZIP; break; Modified: user/gabor/grep/trunk/grep.h ============================================================================== --- user/gabor/grep/trunk/grep.h Mon Aug 29 20:00:57 2011 (r225250) +++ user/gabor/grep/trunk/grep.h Mon Aug 29 20:36:21 2011 (r225251) @@ -62,6 +62,8 @@ extern const char *errstr[]; #define FILE_STDIO 0 #define FILE_GZIP 1 #define FILE_BZIP 2 +#define FILE_XZ 3 +#define FILE_LZMA 4 #define DIR_READ 0 #define DIR_SKIP 1