From owner-p4-projects@FreeBSD.ORG Fri Jun 6 11:42:29 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 841B91065687; Fri, 6 Jun 2008 11:42:29 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2D9AC1065683 for ; Fri, 6 Jun 2008 11:42:29 +0000 (UTC) (envelope-from gabor@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 106E98FC19 for ; Fri, 6 Jun 2008 11:42:29 +0000 (UTC) (envelope-from gabor@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m56BgSi1004645 for ; Fri, 6 Jun 2008 11:42:29 GMT (envelope-from gabor@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m56BgSa5004643 for perforce@freebsd.org; Fri, 6 Jun 2008 11:42:28 GMT (envelope-from gabor@freebsd.org) Date: Fri, 6 Jun 2008 11:42:28 GMT Message-Id: <200806061142.m56BgSa5004643@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gabor@freebsd.org using -f From: Gabor Kovesdan To: Perforce Change Reviews Cc: Subject: PERFORCE change 143021 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Jun 2008 11:42:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=143021 Change 143021 by gabor@gabor_server on 2008/06/06 11:41:45 - Add some work-in-progress code about --color / --colour Affected files ... .. //depot/projects/soc2008/gabor_textproc/grep/grep.1#6 edit .. //depot/projects/soc2008/gabor_textproc/grep/grep.c#13 edit .. //depot/projects/soc2008/gabor_textproc/grep/grep.h#11 edit .. //depot/projects/soc2008/gabor_textproc/grep/util.c#13 edit Differences ... ==== //depot/projects/soc2008/gabor_textproc/grep/grep.1#6 (text+ko) ==== @@ -29,7 +29,7 @@ .\" .\" @(#)grep.1 8.3 (Berkeley) 4/18/94 .\" -.Dd 5 Jun, 2008 +.Dd 6 Jun, 2008 .Dt GREP 1 .Os .Sh NAME @@ -46,6 +46,8 @@ .Op Fl e Ar pattern .Op Fl f Ar file .Op Fl Fl binary-files Ns = Ns Ar value +.Op Fl Fl color Ns Op = Ns Ar when +.Op Fl Fl colour Ns Op = Ns Ar when .Op Fl Fl context Ns Op = Ns Ar num .Op Fl Fl label .Op Fl Fl line-buffered @@ -146,11 +148,11 @@ no whitespace may be given between the option and its argument. .It Fl c , Fl Fl count Only a count of selected lines is written to standard output. -.\"XXX: UNIMPLEMENTED .It Fl Fl colour Ns = Ns Op Ar when , Fl Fl color Ns = Ns Op Ar when -.\"Mark up the matching text with the expression stored in -.\".Ev GREP_COLOR -.\"environment variable. -.\"The possible values of when can be `never', `always' or `auto'. +.It Fl Fl colour Ns = Ns Op Ar when , Fl Fl color Ns = Ns Op Ar when +Mark up the matching text with the expression stored in +.Ev GREP_COLOR +environment variable. +The possible values of when can be `never', `always' or `auto'. .\".It Fl D Ar action , Fl Fl devices Ns = Ns Ar action .\"XXX: Undocumented. .\".It Fl d Ar action , Fl Fl directories Ns = Ns Ar action ==== //depot/projects/soc2008/gabor_textproc/grep/grep.c#13 (text+ko) ==== @@ -93,11 +93,13 @@ int lbflag; /* --line-buffered */ int nullflag; /* --null */ char *label; /* --label */ +char *color; /* --color */ int binbehave = BIN_FILE_BIN; enum { BIN_OPT = CHAR_MAX + 1, + COLOR_OPT, HELP_OPT, MMAP_OPT, LINEBUF_OPT, @@ -122,7 +124,7 @@ { fprintf(stderr, "usage: %s [-abcDEFGHhIiLlnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]\n" - "\t[-e pattern] [-f file] [--binary-files=value] [--context[=num]]\n" + "\t[--color=when] [-e pattern] [-f file] [--binary-files=value] [--context[=num]]\n" "\t[--label] [--line-buffered] [--null] [pattern] [file ...]\n" , __progname); exit(2); @@ -138,9 +140,8 @@ {"line-buffered", no_argument, NULL, LINEBUF_OPT}, {"label", required_argument, NULL, LABEL_OPT}, {"null", no_argument, NULL, NULL_OPT}, -/* XXX: UNIMPLEMENTED {"color", optional_argument, NULL, COLOR_OPT}, - {"colour", optional_argument, NULL, COLOR_OPT}, */ + {"colour", optional_argument, NULL, COLOR_OPT}, {"after-context", required_argument, NULL, 'A'}, {"text", no_argument, NULL, 'a'}, {"before-context", required_argument, NULL, 'B'}, @@ -436,6 +437,18 @@ else errx(2, "Unknown binary-files option"); break; + case COLOR_OPT: + if (optarg == NULL) + optarg = "auto"; + if (strcmp("always", optarg) == 0) { + color = getenv("GREP_COLOR"); + if (color == NULL) + color = "01;31"; + } else if ((strcmp("auto", optarg) == 0)) + color = getenv("GREP_COLOR"); + else if (strcmp("never", optarg) == 0) + color = NULL; + break; case LABEL_OPT: label = optarg; break; ==== //depot/projects/soc2008/gabor_textproc/grep/grep.h#11 (text+ko) ==== @@ -65,7 +65,7 @@ bflag, cflag, hflag, iflag, lflag, nflag, Oflag, oflag, qflag, sflag, vflag, wflag, xflag, nullflag; -extern char *label; +extern char *color, *label; extern int binbehave; extern int first, matchall, patterns, tail; ==== //depot/projects/soc2008/gabor_textproc/grep/util.c#13 (text+ko) ==== @@ -215,7 +215,31 @@ if (pmatch.rm_so != 0 || pmatch.rm_eo != l->len) r = REG_NOMATCH; } - if (r == 0 && oflag) { + if ((r == 0) && (color != NULL)) { +/* XXX: this color stuff does not work yet :( */ + if (oflag) { + char *matched, *tmp; + matched = malloc((pmatch.rm_eo - pmatch.rm_so + 2) * sizeof(char)); + strncpy(matched, &(l->dat[pmatch.rm_so]), pmatch.rm_eo - pmatch.rm_so + 1); + tmp = malloc((strlen(matched) + 50) * sizeof(char)); + sprintf(tmp, "\33[%sm%s\33[00m", color, matched); + } else { + char *tmp, *begin, *matched, *end; + begin = malloc(strlen(l->dat) - pmatch.rm_so + 1); + matched = malloc((pmatch.rm_eo - pmatch.rm_so + 2) * sizeof(char)); + end = malloc(strlen(l->dat) - pmatch.rm_eo); + strncpy(begin, l->dat, pmatch.rm_so); + strncpy(matched, &(l->dat[pmatch.rm_so]), pmatch.rm_eo - pmatch.rm_so + 1); + strncpy(end, &(l->dat[pmatch.rm_eo]), strlen(l->dat) - strlen(begin) - strlen(matched)); + tmp = malloc((strlen(l->dat) + 50) * sizeof(char)); + sprintf(tmp, "%s\33[%sm%s\33[00m%s", begin, color, matched, end); + free(begin); + free(matched); + free(end); + l->dat = tmp; + } + } + if (r == 0 && oflag && (color == NULL)) { char *tmp; if ((tmp = malloc((pmatch.rm_eo - pmatch.rm_so + 2) * sizeof(char))) == NULL) errx(2, NULL);