PERFORCE change 143422 for review

Gabor Kovesdan gabor at FreeBSD.org
Fri Jun 13 17:52:11 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=143422

Change 143422 by gabor at gabor_server on 2008/06/13 17:51:54

	- Check in some work-in-progress code for -J

Affected files ...

.. //depot/projects/soc2008/gabor_textproc/grep/Makefile#3 edit
.. //depot/projects/soc2008/gabor_textproc/grep/binary.c#5 edit
.. //depot/projects/soc2008/gabor_textproc/grep/file.c#4 edit
.. //depot/projects/soc2008/gabor_textproc/grep/grep.c#16 edit
.. //depot/projects/soc2008/gabor_textproc/grep/grep.h#12 edit

Differences ...

==== //depot/projects/soc2008/gabor_textproc/grep/Makefile#3 (text+ko) ====

@@ -15,9 +15,9 @@
 	grep.1 zegrep.1 \
 	grep.1 zfgrep.1
 
-CFLAGS+= -std=c99 -Wall -pedantic
+CFLAGS+= -std=c99 -Wall -pedantic -ggdb
 
-LDADD=	-lz
-DPADD=	${LIBZ}
+LDADD=	-lz -lbz2
+DPADD=	${LIBZ} ${LIBBZ2}
 
 .include <bsd.prog.mk>

==== //depot/projects/soc2008/gabor_textproc/grep/binary.c#5 (text+ko) ====

@@ -34,6 +34,7 @@
 #endif
 #endif /* not lint */
 
+#include <bzlib.h>
 #include <ctype.h>
 #include <err.h>
 #include <stdio.h>

==== //depot/projects/soc2008/gabor_textproc/grep/file.c#4 (text+ko) ====

@@ -36,6 +36,7 @@
 
 #include <sys/param.h>
 
+#include <bzlib.h>
 #include <err.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -51,6 +52,7 @@
 #define FILE_STDIO	0
 #define FILE_MMAP	1
 #define FILE_GZIP	2
+#define FILE_BZIP	3
 
 struct file {
 	int		 type;
@@ -58,9 +60,27 @@
 	FILE		*f;
 	struct mmfile	*mmf;
 	gzFile		*gzf;
+	BZFILE		*bzf;
 };
 
 static char *
+bzfgetln(BZFILE *f, size_t *len)
+{
+	int	bzerror;
+
+	if (lnbuflen != *len)
+	{
+		lnbuflen = *len;
+		lnbuf = grep_realloc(lnbuf, ++lnbuflen);
+	}
+
+	if (BZ2_bzRead(&bzerror, f, lnbuf, *len) > 0)
+		return (lnbuf);
+	else
+		return (NULL);
+}
+
+static char *
 gzfgetln(gzFile *f, size_t *len)
 {
 	size_t	 n;
@@ -113,6 +133,11 @@
 		f->noseek = lseek(fd, 0L, SEEK_SET) == -1;
 		if ((f->gzf = gzdopen(fd, mode)) != NULL)
 			return (f);
+	} else if (Jflag) {
+		f->type = FILE_BZIP;
+		f->noseek = lseek(fd, 0L, SEEK_SET) == -1;
+		if ((f->bzf = BZ2_bzdopen(fd, mode)) != NULL)
+			return (f);
 	} else
 	{
 		f->type = FILE_STDIO;
@@ -139,8 +164,11 @@
 		f->type = FILE_GZIP;
 		if ((f->gzf = gzopen(fname, mode)) != NULL)
 			return (f);
-	} else
-	{
+	} else if (Jflag) {
+		f->type = FILE_BZIP;
+		if ((f->bzf = BZ2_bzopen(fname, mode)) != NULL)
+			return (f);
+	} else {
 		/* try mmap first; if it fails, try stdio */
 		if ((f->mmf = mmopen(fname, mode)) != NULL) {
 			f->type = FILE_MMAP;
@@ -168,6 +196,10 @@
 		return (mmbin_file(f->mmf));
 	case FILE_GZIP:
 		return (gzbin_file(f->gzf));
+	case FILE_BZIP:
+/*XXX
+		return (bzbin_file(f->bzf)); */
+		return (0);
 	default:
 		/* NOTREACHED */
 		errx(2, "invalid file type");
@@ -184,6 +216,8 @@
 		return (mmfgetln(f->mmf, l));
 	case FILE_GZIP:
 		return (gzfgetln(f->gzf, l));
+	case FILE_BZIP:
+		return (bzfgetln(f->bzf, l));
 	default:
 		/* NOTREACHED */
 		errx(2, "invalid file type");
@@ -203,6 +237,9 @@
 	case FILE_GZIP:
 		gzclose(f->gzf);
 		break;
+	case FILE_BZIP:
+		BZ2_bzclose(f->bzf);
+		break;
 	default:
 		/* NOTREACHED */
 		errx(2, "invalid file type");

==== //depot/projects/soc2008/gabor_textproc/grep/grep.c#16 (text+ko) ====

@@ -72,12 +72,13 @@
 int	 Fflag;		/* -F: interpret pattern as list of fixed strings */
 int	 Gflag;		/* -G: interpret pattern as basic regexp */
 int	 Hflag;		/* -H: always print file name */
+int	 Jflag;		/* -J: grep in bzipped file */
 int	 Lflag;		/* -L: only show names of files with no matches */
 int	 Oflag;		/* -O: if -R, follow explicitly listed symlinks */
 int	 Pflag;		/* -P: if -R, no symlinks are followed */
 int	 Rflag;		/* -R: recursively search directory trees */
 int	 Sflag;		/* -S: if -R, follow all symlinks */
-int	 Zflag;		/* -Z: decompress input before processing */
+int	 Zflag;		/* -Z: grep in gzipped file */
 int	 bflag;		/* -b: show block numbers for each match */
 int	 cflag;		/* -c: only show a count of matching lines */
 int	 hflag;		/* -h: don't print filename headers */
@@ -123,7 +124,7 @@
 usage(void)
 {
 	fprintf(stderr,
-	    "usage: %s [-abcDEFGHhIiLlnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]\n"
+	    "usage: %s [-abcDEFGHhIiJLlnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]\n"
 	    "\t[-e pattern] [-f file] [--binary-files=value] [--color=when]\n"
 	    "\t[--context[=num]] [--directories=action] [--label] [--line-buffered]\n"
 	    "\t[--null] [pattern] [file ...]\n"
@@ -131,7 +132,7 @@
 	exit(2);
 }
 
-static char	*optstr = "0123456789A:B:CD:EFGHILOPSRUVZabcd:e:f:hilnoqrsuvwxy";
+static char	*optstr = "0123456789A:B:CD:EFGHIJLOPSRUVZabcd:e:f:hilnoqrsuvwxy";
 
 struct option long_options[] =
 {
@@ -159,8 +160,7 @@
 	{"no-filename",		no_argument,		NULL, 'h'},
 	{"with-filename",	no_argument,		NULL, 'H'},
 	{"ignore-case",		no_argument,		NULL, 'i'},
-/* XXX: UNIMPLEMENTED
-	{"bz2decompress",	no_argument,		NULL, 'J'}, */
+	{"bz2decompress",	no_argument,		NULL, 'J'},
 	{"files-with-matches",	no_argument,		NULL, 'l'},
 	{"files-without-match", no_argument,            NULL, 'L'},
 /* XXX: UNIMPLEMENTED
@@ -377,6 +377,10 @@
 			iflag = 1;
 			cflags |= REG_ICASE;
 			break;
+		case 'J':
+			Zflag = 0;
+			Jflag++;
+			break;
 		case 'L':
 			lflag = 0;
 			Lflag = qflag = 1;

==== //depot/projects/soc2008/gabor_textproc/grep/grep.h#12 (text+ko) ====

@@ -60,7 +60,7 @@
 extern int	 cflags, eflags;
 
 /* Command line flags */
-extern int	 Aflag, Bflag, Dflag, Eflag, Fflag, Gflag, Hflag, Lflag, Pflag,
+extern int	 Aflag, Bflag, Dflag, Eflag, Fflag, Gflag, Hflag, Jflag, Lflag, Pflag,
 		 Sflag, Rflag, Zflag,
 		 bflag, cflag, hflag, iflag, lflag, nflag, Oflag, oflag, qflag, sflag,
 		 vflag, wflag, xflag,


More information about the p4-projects mailing list