maint: factor out common code; prohibit use of HAVE_MBRTOWC
authorJim Meyering <meyering@redhat.com>
Mon, 29 Dec 2008 15:34:45 +0000 (16:34 +0100)
committerJim Meyering <meyering@redhat.com>
Thu, 1 Jan 2009 01:15:07 +0000 (02:15 +0100)
* maint.mk (_prohibit_regexp): New macro.
(sc_avoid_if_before_free, sc_cast_of_argument_to_free):
(sc_cast_of_x_alloc_return_value, sc_cast_of_alloca_return_value):
(sc_space_tab, sc_prohibit_atoi_atof, sc_prohibit_strcmp):
(sc_prohibit_stat_st_blocks, sc_prohibit_S_IS_definition): Use it.
(sc_prohibit_HAVE_MBRTOWC): New rule.

maint.mk

index 83b7e1f..5a89965 100644 (file)
--- a/maint.mk
+++ b/maint.mk
@@ -92,6 +92,17 @@ syntax-check: $(local-check)
 #          exit 1; } || :
 # FIXME: don't allow `#include .strings\.h' anywhere
 
+# There are many rules below that prohibit constructs in this package.
+# If the offending construct can be matched with a grep-E-style regexp,
+# use this macro.  The shell variables "re" and "msg" must be defined.
+define _prohibit_regexp
+  dummy=; : so we do not need a semicolon before each use              \
+  test "x$$re" != x || { echo '$(ME): re not defined' 1>&2; exit 1; }; \
+  test "x$$msg" != x || { echo '$(ME): msg not defined' 1>&2; exit 1; };\
+  grep -nE "$$re" $$($(VC_LIST_EXCEPT)) &&                             \
+    { echo '$(ME): '"$$msg" 1>&2; exit 1; } || :
+endef
+
 sc_avoid_if_before_free:
        @$(srcdir)/build-aux/useless-if-before-free                     \
                $(useless_free_options)                                 \
@@ -100,32 +111,29 @@ sc_avoid_if_before_free:
            exit 1; } || :
 
 sc_cast_of_argument_to_free:
-       @grep -nE '\<free *\( *\(' $$($(VC_LIST_EXCEPT)) &&             \
-         { echo '$(ME): don'\''t cast free argument' 1>&2;             \
-           exit 1; } || :
+       @re='\<free *\( *\(' msg='don'\''t cast free argument'          \
+         $(_prohibit_regexp)
 
 sc_cast_of_x_alloc_return_value:
-       @grep -nE '\*\) *x(m|c|re)alloc\>' $$($(VC_LIST_EXCEPT)) &&     \
-         { echo '$(ME): don'\''t cast x*alloc return value' 1>&2;      \
-           exit 1; } || :
+       @re='\*\) *x(m|c|re)alloc\>'                                    \
+       msg='don'\''t cast x*alloc return value'                        \
+         $(_prohibit_regexp)
 
 sc_cast_of_alloca_return_value:
-       @grep -nE '\*\) *alloca\>' $$($(VC_LIST_EXCEPT)) &&             \
-         { echo '$(ME): don'\''t cast alloca return value' 1>&2;       \
-           exit 1; } || :
+       @re='\*\) *alloca\>' msg='don'\''t cast alloca return value'    \
+         $(_prohibit_regexp)
 
 sc_space_tab:
-       @grep -n '[ ]   ' $$($(VC_LIST_EXCEPT)) &&                      \
-         { echo '$(ME): found SPACE-TAB sequence; remove the SPACE'    \
-               1>&2; exit 1; } || :
+       @re='[ ]        ' msg='found SPACE-TAB sequence; remove the SPACE' \
+         $(_prohibit_regexp)
 
 # Don't use *scanf or the old ato* functions in `real' code.
 # They provide no error checking mechanism.
 # Instead, use strto* functions.
 sc_prohibit_atoi_atof:
-       @grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(VC_LIST_EXCEPT)) && \
-         { echo '$(ME): do not use *scan''f, ato''f, ato''i, ato''l, ato''ll, ato''q, or ss''canf'     \
-               1>&2; exit 1; } || :
+       @re='\<([fs]?scanf|ato([filq]|ll))\>'                           \
+       msg='do not use *scan''f, ato''f, ato''i, ato''l, ato''ll or ato''q' \
+         $(_prohibit_regexp)
 
 # Use STREQ rather than comparing strcmp == 0, or != 0.
 sc_prohibit_strcmp:
@@ -204,6 +212,10 @@ sc_require_config_h_first:
        else :;                                                         \
        fi
 
+sc_prohibit_HAVE_MBRTOWC:
+       @re='\bHAVE_MBRTOWC\b' msg="do not use $$re; it is always defined" \
+         $(_prohibit_regexp)
+
 # To use this "command" macro, you must first define two shell variables:
 # h: the header, enclosed in <> or ""
 # re: a regular expression that matches IFF something provided by $h is used.
@@ -353,16 +365,15 @@ sc_GPL_version:
 # This is a bit of a kludge, since it prevents use of the string
 # even in comments, but for now it does the job with no false positives.
 sc_prohibit_stat_st_blocks:
-       @grep -nE '[.>]st_blocks' $$($(VC_LIST_EXCEPT)) && \
-         { echo '$(ME): do not use st_blocks; use ST_NBLOCKS'          \
-               1>&2; exit 1; } || :
+       @re='[.>]st_blocks' msg='do not use st_blocks; use ST_NBLOCKS'  \
+         $(_prohibit_regexp)
 
 # Make sure we don't define any S_IS* macros in src/*.c files.
 # They're already defined via gnulib's sys/stat.h replacement.
 sc_prohibit_S_IS_definition:
-       @grep -nE '^ *# *define  *S_IS' $$($(VC_LIST_EXCEPT)) &&        \
-         { echo '$(ME): do not define S_IS* macros; include <sys/stat.h>' \
-               1>&2; exit 1; } || :
+       @re='^ *# *define  *S_IS'                                       \
+       msg='do not define S_IS* macros; include <sys/stat.h>'          \
+         $(_prohibit_regexp)
 
 # Each program that uses proper_name_utf8 must link with
 # one of the ICONV libraries.