summaryrefslogtreecommitdiff
path: root/userdiff.c
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2011-05-21 19:38:26 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-05-22 05:29:32 (GMT)
commitea2ca4497bdb716977a3e2526780635cb6bac513 (patch)
tree88503ab48c0fa26bdced5e199ca7c0b2653acfae /userdiff.c
parent12f0967a8a1e3c11c678de181f77d1c7883b37cf (diff)
downloadgit-ea2ca4497bdb716977a3e2526780635cb6bac513.zip
git-ea2ca4497bdb716977a3e2526780635cb6bac513.tar.gz
git-ea2ca4497bdb716977a3e2526780635cb6bac513.tar.bz2
userdiff/perl: catch sub with brace on second line
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 <avarab@gmail.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'userdiff.c')
-rw-r--r--userdiff.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/userdiff.c b/userdiff.c
index 32ead96..42b86ac 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:]_']*"