From ea2ca4497bdb716977a3e2526780635cb6bac513 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Sat, 21 May 2011 14:38:26 -0500 Subject: userdiff/perl: catch sub with brace on second line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Accept sub foo { } as an alternative to a more common style that introduces perl functions with a brace on the first line (and likewise for BEGIN/END blocks). The new regex is a little hairy to avoid matching # forward declaration sub foo; while continuing to match "sub foo($;@) {" and sub foo { # This routine is interesting; # in fact, the lines below explain how... While at it, pay attention to Perl 5.14's "package foo {" syntax as an alternative to the traditional "package foo;". Requested-by: Ævar Arnfjörð Bjarmason Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- userdiff.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'userdiff.c') diff --git a/userdiff.c b/userdiff.c index 32ead9654..42b86ac63 100644 --- a/userdiff.c +++ b/userdiff.c @@ -60,9 +60,23 @@ PATTERNS("pascal", "|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+" "|<>|<=|>=|:=|\\.\\."), PATTERNS("perl", - "^package .*;\n" - "^sub .* \\{\n" - "^[A-Z]+ \\{\n" /* BEGIN, END, ... */ + "^package .*\n" + "^sub [[:alnum:]_':]+[ \t]*" + "(\\([^)]*\\)[ \t]*)?" /* prototype */ + /* + * Attributes. A regex can't count nested parentheses, + * so just slurp up whatever we see, taking care not + * to accept lines like "sub foo; # defined elsewhere". + * + * An attribute could contain a semicolon, but at that + * point it seems reasonable enough to give up. + */ + "(:[^;#]*)?" + "(\\{[ \t]*)?" /* brace can come here or on the next line */ + "(#.*)?$\n" /* comment */ + "^[A-Z]+[ \t]*" /* BEGIN, END, ... */ + "(\\{[ \t]*)?" /* brace can come here or on the next line */ + "(#.*)?$\n" "^=head[0-9] .*", /* POD */ /* -- */ "[[:alpha:]_'][[:alnum:]_']*" -- cgit v1.2.1