[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] maint: enforce one small aspect of formatting style: space-b
From: |
Jim Meyering |
Subject: |
Re: [PATCH] maint: enforce one small aspect of formatting style: space-before-"(" |
Date: |
Sat, 20 Mar 2010 21:11:55 +0100 |
Bruno Haible wrote:
> A large part of them are in comments. I would suggest to exempt comments
> (since comments are not code). Like this:
>
> # A sed expression that removes ANSI C and ISO C99 comments.
> # Taken from GNU gettext's 'moopp' preprocessor.
> sed_remove_comments="
> /[/][/*]/{
> ta
> :a
>
> s,^\\(\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*\\)//.*,\\1,
> te
>
> s,^\\(\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*\\)/[*]\\([^*]\\|[*][^/*]\\)*[*][*]*/,\\1
> ,
> ta
>
> /^\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*[/][*]/{
>
> s,^\\(\\([^\"'/]\\|\"\\([^\\\"]\\|[\\].\\)*\"\\|'\\([^\\']\\|[\\].\\)*'\\|[/][^\"'/*]\\|[/]\"\\([^\\\"]\\|[\\].\\)*\"\\|[/]'\\([^\\']\\|[\\].\\)*'\\)*\\)/[*].*,\\1
> ,
> tu
> :u
> n
> s,^\\([^*]\\|[*][^/*]\\)*[*][*]*/,,
> tv
> s,^.*\$,,
> bu
> :v
> }
> :e
> }"
>
> $ for file in `git ls-files | grep '\.[ch]$'`; do
> sed -e "$sed_remove_comments" < $file | grep '[[:alnum:]](' | grep -vE '^
> *(\* |#|({ )?/\*)' | sed -e "s|^|$file:|"
> done
I like that.
But prefer to avoid the long lines and duplication.
It's hard enough to read long regexps, but when
the same 100-byte subexpression appears so many times...
In the patch below, I've factored that, unquoted and
re-quoted for make and added semicolons.
> This leaves 916 occurrences, which is more reasonable (attached below).
>
> The occurrences in strings should also be excluded.
>
> Out of these, I would be willing to fix those which refer to function names
> and C keyword such as 'if' or 'switch'.
>
> Regarding macro names, such as in
> INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
> CONCAT(TABLE,_get) (struct TABLE *t, uint32_t wc)
> I would prefer to keep it as is: The lack of a space indicates that the
> macro is not function-like; it is rearranging or concatenating tokens.
Sounds reasonable.
Here's a change to incorporate your sed command into the
syntax-check rule in coreutils:
>From 3512e80e8801df079568cda2714f2ff53d617812 Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Sat, 20 Mar 2010 21:05:24 +0100
Subject: [PATCH] cfg.mk: remove comments with sed rather than cpp -fpreprocessed
* cfg.mk (_sed_remove_comments): Define.
(sc_space_before_open_paren): Adapt.
Based on suggestion and code from Bruno Haible.
---
cfg.mk | 61 +++++++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 45 insertions(+), 16 deletions(-)
diff --git a/cfg.mk b/cfg.mk
index 0ce1c61..06080f7 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -261,27 +261,56 @@ sc_prohibit_sleep:
msg='prefer xnanosleep over other sleep interfaces' \
$(_prohibit_regexp)
+###########################################################
+_p0 = \([^"'/]\|"\([^\"]\|[\].\)*"\|'\([^\']\|[\].\)*'
+_pre = $(_p0)\|[/][^"'/*]\|[/]"\([^\"]\|[\].\)*"\|[/]'\([^\']\|[\].\)*'\)*
+_pre_anchored = ^\($(_pre)\)
+_comment_and_close = [^*]\|[*][^/*]\)*[*][*]*/
+# help font-lock mode: '
+
+# A sed expression that removes ANSI C and ISO C99 comments.
+# Derived from the one in GNU gettext's 'moopp' preprocessor.
+_sed_remove_comments = \
+/[/][/*]/{ \
+ ta; \
+ :a; \
+ s,$(_pre_anchored)//.*,\1,; \
+ te; \
+ s,$(_pre_anchored)/[*]\($(_comment_and_close),\1 ,; \
+ ta; \
+ /^$(_pre)[/][*]/{ \
+ s,$(_pre_anchored)/[*].*,\1 ,; \
+ tu; \
+ :u; \
+ n; \
+ s,^\($(_comment_and_close),,; \
+ tv; \
+ s,^.*$$,,; \
+ bu; \
+ :v; \
+ }; \
+ :e; \
+}
+# Quote all single quotes.
+_sed_rm_comments_q = $(subst ','\'',$(_sed_remove_comments))
+# help font-lock mode: '
+
_space_before_paren_exempt =? \\n\\$$
_space_before_paren_exempt = \
- (\\n\\$$|%s\(to %s|delimit-method|(date|group|character)\(s\))
+ (^ *\#|\\n\\$$|%s\(to %s|delimit-method|(date|group|character)\(s\))
# Ensure that there is a space before each open parenthesis in C code.
sc_space_before_open_paren:
@if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then \
- if (cpp -fpreprocessed < /dev/null > /dev/null 2>&1); then \
- fail=0; \
- for c in $$($(VC_LIST_EXCEPT) | grep '\.[ch]$$'); do \
- cpp -fpreprocessed $$c 2>/dev/null \
- | grep -ni '[[:alnum:]](' \
- | grep -vE '$(_space_before_paren_exempt)' \
- | grep . && { fail=1; echo "*** $$c"; }; \
- done; \
- test $$fail = 1 && \
- { echo '$(ME): the above files lack a space-before-open-paren' \
- 1>&2; exit 1; } || :; \
- else \
- echo '$(ME): skipping test $@: cpp -fpreprocessed does not work' \
- 1>&2; \
- fi; \
+ fail=0; \
+ for c in $$($(VC_LIST_EXCEPT) | grep '\.[ch]$$'); do \
+ sed '$(_sed_rm_comments_q)' $$c 2>/dev/null \
+ | grep -i '[[:alnum:]](' \
+ | grep -vE '$(_space_before_paren_exempt)' \
+ | grep . && { fail=1; echo "*** $$c"; }; \
+ done; \
+ test $$fail = 1 && \
+ { echo '$(ME): the above files lack a space-before-open-paren' \
+ 1>&2; exit 1; } || :; \
else :; \
fi
--
1.7.0.2.455.g91132
Re: [PATCH] maint: enforce one small aspect of formatting style: space-before-"(", Jim Meyering, 2010/03/20