From owner-p4-projects@FreeBSD.ORG Tue Jul 15 13:00:20 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DCFA81065671; Tue, 15 Jul 2008 13:00:19 +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 A00EB106566C for ; Tue, 15 Jul 2008 13:00:19 +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 8061A8FC15 for ; Tue, 15 Jul 2008 13:00:19 +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 m6FD0Jjt044087 for ; Tue, 15 Jul 2008 13:00:19 GMT (envelope-from gabor@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6FD0JD9044085 for perforce@freebsd.org; Tue, 15 Jul 2008 13:00:19 GMT (envelope-from gabor@freebsd.org) Date: Tue, 15 Jul 2008 13:00:19 GMT Message-Id: <200807151300.m6FD0JD9044085@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 145277 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: Tue, 15 Jul 2008 13:00:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=145277 Change 145277 by gabor@gabor_server on 2008/07/15 13:00:19 - Add some work-in-progress PCRE code Affected files ... .. //depot/projects/soc2008/gabor_textproc/grep/Makefile#12 edit .. //depot/projects/soc2008/gabor_textproc/grep/grep.c#67 edit .. //depot/projects/soc2008/gabor_textproc/grep/grep.h#38 edit .. //depot/projects/soc2008/gabor_textproc/grep/util.c#61 edit Differences ... ==== //depot/projects/soc2008/gabor_textproc/grep/Makefile#12 (text+ko) ==== @@ -21,9 +21,10 @@ DPADD= ${LIBZ} ${LIBBZ2} .if defined(WITH_PCRE) -CFLAGS+= WITH_PCRE=yes +CFLAGS+= -DWITH_PCRE=yes -I/usr/local/include +LDFLAGS+= -L/usr/local/lib LDADD+= -lpcre -DPADD= /usr/local/lib/libpcre.a +DPADD+= /usr/local/lib/libpcre.a .endif .if !defined(WITHOUT_NLS) ==== //depot/projects/soc2008/gabor_textproc/grep/grep.c#67 (text+ko) ==== @@ -87,6 +87,9 @@ int patterns, pattern_sz; char **pattern; regex_t *r_pattern; +#ifdef WITH_PCRE +pcre **perl_pattern; +#endif /* Filename exclusion/inclusion patterns */ int epatterns, epattern_sz; @@ -551,20 +554,35 @@ cflags |= REG_EXTENDED; break; case GREP_PERL: - errx(2, "Not yet implemented"); break; default: /* NOTREACHED */ usage(); } - r_pattern = grep_calloc(patterns, sizeof(*r_pattern)); - for (i = 0; i < patterns; ++i) { - c = regcomp(&r_pattern[i], pattern[i], cflags); - if (c != 0) { - regerror(c, &r_pattern[i], re_error, - RE_ERROR_BUF); - errx(2, "%s", re_error); + if (grepbehave != GREP_PERL) { + r_pattern = grep_calloc(patterns, sizeof(*r_pattern)); + for (i = 0; i < patterns; ++i) { + c = regcomp(&r_pattern[i], pattern[i], cflags); + if (c != 0) { + regerror(c, &r_pattern[i], re_error, + RE_ERROR_BUF); + errx(2, "%s", re_error); + } + } + } else { +#ifdef WITH_PCRE + perl_pattern = grep_calloc(patterns, sizeof(perl_pattern)); + for (i = 0; i < patterns; ++i) { + char **err_msg = NULL; + int erroff; + + perl_pattern[i] = pcre_compile(pattern[i], 0, (const char **)err_msg, &erroff, NULL); + if (perl_pattern[i] != NULL) + errx(2, "wrong PCRE: %s", err_msg[0]); } +#else + ; +#endif } if (lbflag) ==== //depot/projects/soc2008/gabor_textproc/grep/grep.h#38 (text+ko) ==== @@ -31,7 +31,7 @@ #include #include -#if defined(WITH_PCRE) +#ifdef WITH_PCRE #include #endif @@ -100,12 +100,17 @@ extern int nullflag, exclflag, inclflag; extern unsigned long long Aflag, Bflag, mcount; extern char *color, *label; -extern int binbehave, filebehave, devbehave, dirbehave, linkbehave; +extern int grepbehave, binbehave, filebehave, devbehave, dirbehave, linkbehave; extern int first, prev, matchall, patterns, epatterns, tail, notfound; extern char **pattern, **epattern; extern regex_t *r_pattern, *er_pattern; +#ifdef WITH_PCRE +extern pcre **perl_pattern; +#endif + + /* For regex errors */ #define RE_ERROR_BUF 512 extern char re_error[RE_ERROR_BUF + 1]; /* Seems big enough */ ==== //depot/projects/soc2008/gabor_textproc/grep/util.c#61 (text+ko) ==== @@ -221,7 +221,10 @@ regmatch_t pmatch; regmatch_t matches[MAX_LINE_MATCHES]; regoff_t st = 0; - int c = 0, i, r, m = 0, t; + int c = 0, i, r = 0, m = 0, t; +#ifdef WITH_PCRE + int ovector[3]; +#endif if (!matchall) { t = vflag ? REG_NOMATCH : 0; @@ -231,7 +234,19 @@ pmatch.rm_eo = l->len; for (i = 0; i < patterns; i++) { - r = regexec(&r_pattern[i], l->dat, 1, &pmatch, eflags); + if (grepbehave != GREP_PERL) { + r = regexec(&r_pattern[i], l->dat, 1, &pmatch, eflags); + st = pmatch.rm_eo; + } else { +#ifdef WITH_PCRE + r = pcre_exec(perl_pattern[i], NULL, l->dat, l->len, st, 0, &ovector, 3); + pmatch.rm_so = ovector[0]; + pmatch.rm_eo = ovector[1]; + st = ovector[1]; +#else + ; +#endif + } if (r == REG_NOMATCH && t == 0) continue; if (r == 0 && xflag) @@ -256,7 +271,6 @@ matches[m] = pmatch; m++; } - st = pmatch.rm_eo; break; } /* One pass if we are not recording matches */