The prohibit_nonreentrant syntax-check rule spawns a new shell
for every non-reentrant function we know, to make it easier
to mention the function name in the error message, with the _r
appended.
Since the line with the offending function is already printed
and some of the functions on our list do not have a _r counterpart,
compile them into one big regex and use a more generic error message
to save time.
---
Makefile.nonreentrant | 8 ++++++++
cfg.mk | 13 +++----------
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/Makefile.nonreentrant b/Makefile.nonreentrant
index 78e26e3..5cc64c0 100644
--- a/Makefile.nonreentrant
+++ b/Makefile.nonreentrant
@@ -113,3 +113,11 @@ NON_REENTRANT += inet_nsap_ntoa
NON_REENTRANT += inet_ntoa
NON_REENTRANT += inet_ntop
NON_REENTRANT += inet_pton
+
+# Separate two nothings by space to get one space in a variable
+space =
+space +=
+# The space needs to be in a variable otherwise it would be ignored.
+# And there must be no spaces around the commas because they would
+# not be ignored, logically.
+NON_REENTRANT_RE=$(subst $(space),|,$(NON_REENTRANT))
diff --git a/cfg.mk b/cfg.mk
index e7db9a6..812e426 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -440,18 +440,11 @@ sc_prohibit_PATH_MAX:
halt='dynamically allocate paths, do not use PATH_MAX' \
$(_sc_search_regexp)
-# Use a subshell for each function, to give the optimal warning message.
include $(srcdir)/Makefile.nonreentrant
sc_prohibit_nonreentrant:
- @fail=0 ; \
- for i in $(NON_REENTRANT) ; \
- do \
- (prohibit="\\<$$i *\\(" \
- halt="use $${i}_r, not $$i" \
- $(_sc_search_regexp) \
- ) || fail=1; \
- done ; \
- exit $$fail
+ @prohibit="\\<(${NON_REENTRANT_RE}) *\\(" \
+ halt="use re-entrant functions (usually ending with _r)" \
+ $(_sc_search_regexp)
sc_prohibit_select:
@prohibit='\<select *\(' \
--
2.7.3