PERFORCE change 145158 for review

Gabor Kovesdan gabor at FreeBSD.org
Sun Jul 13 15:41:22 UTC 2008


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

Change 145158 by gabor at gabor_server on 2008/07/13 15:40:33

	- Restore the old gzip and bzip2 support, which was better.

Affected files ...

.. //depot/projects/soc2008/gabor_textproc/grep/file.c#16 edit
.. //depot/projects/soc2008/gabor_textproc/grep/grep.c#65 edit
.. //depot/projects/soc2008/gabor_textproc/grep/grep.h#37 edit
.. //depot/projects/soc2008/gabor_textproc/grep/util.c#59 edit

Differences ...

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

@@ -57,8 +57,46 @@
 static int	 binbufsiz;
 char		*binbufptr;
 
+static int	 bzerr;
+
 #define iswbinary(ch)	(!iswspace((ch)) && iswcntrl((ch)))
 
+int
+grep_fgetc(struct file *f)
+{
+	char	 c;
+
+	switch (filebehave) {
+	case FILE_STDIO:
+		return (fgetc(f->f));
+	case FILE_GZIP:
+		return (gzgetc(f->gzf));
+	case FILE_BZIP:
+		BZ2_bzRead(&bzerr, f->bzf, &c, 1);
+		if (bzerr == BZ_STREAM_END)
+			return (-1);
+		else if (bzerr != BZ_SEQUENCE_ERROR && bzerr != BZ_OK)
+			errx(2, "Cannot read bzip2 compressed file");
+		return (c);
+	}
+	return (-1);
+}
+
+int
+grep_feof(struct file *f)
+{
+
+	switch (filebehave) {
+	case FILE_STDIO:
+		return (feof(f->f));
+	case FILE_GZIP:
+		return (gzeof(f->gzf));
+	case FILE_BZIP:
+		return (bzerr == BZ_STREAM_END);
+	}
+	return (1);
+}
+
 char *
 grep_fgetln(struct file *f, size_t *len)
 {
@@ -69,9 +107,9 @@
 
 	if ((binbufptr == NULL) && (binbehave != BINFILE_TEXT)) {
 		for (i = 0; i < (BUFSIZ * 4); i++) {
-			if (feof(f->f))
+			if (grep_feof(f))
 				break;
-			ch = fgetc(f->f);
+			ch = grep_fgetc(f);
 			binbuf[i] = ch;
 		}
 		binbufsiz = i;
@@ -87,9 +125,9 @@
 
 	for (i = 0; ; i++) {
 		if (binbufptr == &binbuf[binbufsiz]) {
-			if (feof(f->f))
+			if (grep_feof(f))
 				break;
-			ch = fgetc(f->f);
+			ch = grep_fgetc(f);
 		} else {
 			ch = binbufptr[0];
 			binbufptr++;
@@ -102,7 +140,7 @@
 			break;
 		lnbuf[i] = ch;
 	}
-	if (feof(f->f) && (i == 0))
+	if (grep_feof(f) && (i == 0))
 		return NULL;
 	*len = i;
 	return (lnbuf);
@@ -128,61 +166,44 @@
 grep_open(char *path)
 {
 	struct file	*f;
-	char		*templ;
-	int		 tempfd;
 
 	snprintf(fname, sizeof fname, "%s", path);
 
 	f = grep_malloc(sizeof *f);
 
-	if (Zflag || Jflag) {
-		templ = grep_malloc(sizeof(char) * 15);
-		strlcpy(templ, "/tmp/grep.XXXXXXXX", 14);
-		if ((tempfd = mkstemp(templ)) == -1)
-			err(2, NULL);
-		free(templ);
-		if (Zflag) {
-			gzFile	*gzf;
-			char	 buf[BUFSIZ];
-			int	 i;
+	switch (filebehave) {
+	case FILE_STDIO:
+		if ((f->f = fopen(path, "r")) != NULL)
+			return (f);
+		break;
+	case FILE_GZIP:
+		if ((f->gzf = gzopen(fname, "r")) != NULL)
+			return (f);
+		break;
+	case FILE_BZIP:
+		if ((f->bzf = BZ2_bzopen(fname, "r")) != NULL)
+			return (f);
+		break;
+	}
 
-			if ((gzf = gzopen(fname, "r")) == NULL)
-				err(2, NULL);
-			while ((i = gzread(gzf, buf, BUFSIZ)) > 0) {
-				write(tempfd, buf, BUFSIZ);
-			}
-			gzclose(gzf);
-			lseek(tempfd, 0L, SEEK_SET);
-			if ((f->f = fdopen(tempfd, "r")) != NULL)
-				return (f);
-			else
-				return (NULL);
-		} else {
-			BZFILE	*bzf;
-			char	 buf[BUFSIZ];
-			int	 bzerror;
-			FILE	*file;
-			if ((file = fopen(fname, "r")) == NULL)
-				err(2, NULL);
-			if ((bzf = BZ2_bzReadOpen(&bzerror, file, 0, 0, NULL, 0)) == NULL)
-				err(2, NULL);
-			do {
-				BZ2_bzRead(&bzerror, bzf, buf, BUFSIZ);
-				write(tempfd, buf, BUFSIZ);
-			} while (bzerror == BZ_OK);
-			BZ2_bzReadClose(&bzerror, bzf);
-			fclose(file);
-			lseek(tempfd, 0L, SEEK_SET);
-			if ((f->f = fdopen(tempfd, "r")) != NULL)
-				return (f);
-			else
-				return (NULL);
-		}
-	}
+	free(f);
+	return (NULL);
+}
 
-	if ((f->f = fopen(path, "r")) != NULL)
-		return (f);
+void
+grep_close(struct file *f)
+{
 
+	switch (filebehave) {
+	case FILE_STDIO:
+		fclose(f->f);
+		break;
+	case FILE_GZIP:
+		gzclose(f->gzf);
+		break;
+	case FILE_BZIP:
+		BZ2_bzclose(f->bzf);
+		break;
+	}
 	free(f);
-	return (NULL);
 }

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

@@ -98,9 +98,7 @@
 unsigned long long Aflag;	/* -A x: print x lines trailing each match */
 unsigned long long Bflag;	/* -B x: print x lines leading each match */
 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	 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 */
@@ -124,6 +122,7 @@
 
 int	 grepbehave = GREP_BASIC;
 int	 binbehave = BINFILE_BIN;
+int	 filebehave = FILE_STDIO;
 int	 devbehave = DEV_GREP;
 int	 dirbehave = DIR_GREP;
 int	 linkbehave = LINK_GREP;
@@ -305,7 +304,7 @@
 		grepbehave = GREP_BASIC;
 		break;
 	case 'z':
-		Zflag++;
+		filebehave = FILE_GZIP;
 		switch(__progname[1]) {
 		case 'e':
 			grepbehave = GREP_EXTENDED;
@@ -408,8 +407,7 @@
 			cflags |= REG_ICASE;
 			break;
 		case 'J':
-			Zflag = 0;
-			Jflag++;
+			filebehave = FILE_BZIP;
 			break;
 		case 'L':
 			lflag = 0;
@@ -474,8 +472,7 @@
 			xflag = 1;
 			break;
 		case 'Z':
-			Jflag = 0;
-			Zflag++;
+			filebehave = FILE_GZIP;
 			break;
 		case BIN_OPT:
 			if (strcmp("binary", optarg) == 0)

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

@@ -26,8 +26,10 @@
  * SUCH DAMAGE.
  */
 
+#include <bzlib.h>
 #include <regex.h>
 #include <stdio.h>
+#include <zlib.h>
 
 #if defined(WITH_PCRE)
 #include <pcre.h>
@@ -55,6 +57,10 @@
 #define BINFILE_SKIP	1
 #define BINFILE_TEXT	2
 
+#define FILE_STDIO	0
+#define FILE_GZIP	1
+#define FILE_BZIP	2
+
 #define DIR_GREP	0
 #define DIR_SKIP	1
 #define DIR_RECURSE	2
@@ -72,6 +78,8 @@
 	int		 binary;
 	FILE		*f;
 	struct mmfile	*mmf;
+	gzFile		*gzf;
+	BZFILE		*bzf;
 };
 
 struct str {
@@ -86,13 +94,13 @@
 extern int	 cflags, eflags;
 
 /* Command line flags */
-extern int	 Eflag, Fflag, Gflag, Hflag, Jflag, Lflag, Zflag,
+extern int	 Eflag, Fflag, Gflag, Hflag, Lflag,
 		 bflag, cflag, hflag, iflag, lflag, mflag, nflag, oflag,
 		 qflag, sflag, vflag, wflag, xflag;
 extern int	 nullflag, exclflag, inclflag;
 extern unsigned long long Aflag, Bflag, mcount;
 extern char	*color, *label;
-extern int	 binbehave, devbehave, dirbehave, linkbehave;
+extern int	 binbehave, filebehave, devbehave, dirbehave, linkbehave;
 
 extern int	 first, prev, matchall, patterns, epatterns, tail, notfound;
 extern char    **pattern, **epattern;
@@ -117,6 +125,9 @@
 void	 clearqueue(void);
 
 /* file.c */
+void		 grep_close(struct file *f);
 struct file	*grep_stdin_open(void);
 struct file	*grep_open(char *path);
+int		 grep_feof(struct file *f);
+int		 grep_fgetc(struct file *f);
 char		*grep_fgetln(struct file *f, size_t *len);

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

@@ -160,7 +160,7 @@
 	}
 
 	if (f->binary && binbehave == BINFILE_SKIP) {
-		fclose(f->f);
+		grep_close(f);
 		free(f);
 		return (0);
 	}
@@ -196,7 +196,7 @@
 	}
 	if (Bflag > 0)
 		clearqueue();
-	fclose(f->f);
+	grep_close(f);
 	free(f);
 
 	if (cflag) {


More information about the p4-projects mailing list