From 9f5dce80702d494535ab332273d20da1f9ca4365 Mon Sep 17 00:00:00 2001 From: Bernhard Voelker Date: Tue, 17 Feb 2015 08:46:56 +0100 Subject: [PATCH] maint: prefer STREQ_LEN and STRPREFIX over strncmp in all cases * cfg.mk (sc_prohibit_strncmp): Improve the search pattern: use _sc_search_regexp to find all invocations of strncmp except when used on a macro definition line; just match the function name with an opening parenthesis. Before, the expression missed places where the comparison against 0 was in a subsequent line. * src/system.h (STRNCMP_LIT): Shorten 'literal' to 'lit' to move the whole definition of the macro into one line - thus making sc_prohibit_strncmp pass. (STRPREFIX): Add space before parenthesis. * src/du.c (main): Prefer STREQ_LEN over strncmp. * src/pinky.c (scan_entries): Likewise. * src/tac.c (tac_seekable): Likewise. * src/who.c (scan_entries): Likewise. --- cfg.mk | 8 +++----- src/du.c | 6 +++--- src/pinky.c | 3 +-- src/system.h | 5 ++--- src/tac.c | 4 ++-- src/who.c | 4 ++-- 6 files changed, 13 insertions(+), 17 deletions(-) diff --git a/cfg.mk b/cfg.mk index 7dc1a20c80..ab0b8a4b62 100644 --- a/cfg.mk +++ b/cfg.mk @@ -581,11 +581,9 @@ sc_space_before_open_paren: # Similar to the gnulib maint.mk rule for sc_prohibit_strcmp # Use STREQ_LEN or STRPREFIX rather than comparing strncmp == 0, or != 0. sc_prohibit_strncmp: - @grep -nE '! *str''ncmp *\(|\&2; exit 1; } || : + @prohibit='^[^#].*str''ncmp *\(' \ + halt='use STREQ_LEN or STRPREFIX instead of str''ncmp' \ + $(_sc_search_regexp) # Enforce recommended preprocessor indentation style. sc_preprocessor_indentation: diff --git a/src/du.c b/src/du.c index 65fc0742f5..86827f808e 100644 --- a/src/du.c +++ b/src/du.c @@ -968,9 +968,9 @@ main (int argc, char **argv) { /* Ignore "posix-" prefix, for compatibility with ls. */ static char const posix_prefix[] = "posix-"; - while (strncmp (time_style, posix_prefix, sizeof posix_prefix - 1) - == 0) - time_style += sizeof posix_prefix - 1; + static const size_t prefix_len = sizeof posix_prefix - 1; + while (STREQ_LEN (time_style, posix_prefix, prefix_len)) + time_style += prefix_len; } } diff --git a/src/pinky.c b/src/pinky.c index f1bf3407ce..71650bfae7 100644 --- a/src/pinky.c +++ b/src/pinky.c @@ -445,8 +445,7 @@ scan_entries (size_t n, const STRUCT_UTMP *utmp_buf, int i; for (i = 0; i < argc_names; i++) - if (strncmp (UT_USER (utmp_buf), argv_names[i], UT_USER_SIZE) - == 0) + if (STREQ_LEN (UT_USER (utmp_buf), argv_names[i], UT_USER_SIZE)) { print_entry (utmp_buf); break; diff --git a/src/system.h b/src/system.h index b6c971d30a..46edd07d54 100644 --- a/src/system.h +++ b/src/system.h @@ -193,12 +193,11 @@ select_plural (uintmax_t n) #define STREQ(a, b) (strcmp (a, b) == 0) #define STREQ_LEN(a, b, n) (strncmp (a, b, n) == 0) -#define STRPREFIX(a, b) (strncmp(a, b, strlen (b)) == 0) +#define STRPREFIX(a, b) (strncmp (a, b, strlen (b)) == 0) /* Just like strncmp, but the second argument must be a literal string and you don't specify the length; that comes from the literal. */ -#define STRNCMP_LIT(s, literal) \ - strncmp (s, "" literal "", sizeof (literal) - 1) +#define STRNCMP_LIT(s, lit) strncmp (s, "" lit "", sizeof (lit) - 1) #if !HAVE_DECL_GETLOGIN char *getlogin (); diff --git a/src/tac.c b/src/tac.c index 9fce47208c..b69953f356 100644 --- a/src/tac.c +++ b/src/tac.c @@ -296,8 +296,8 @@ tac_seekable (int input_fd, const char *file, off_t file_pos) { /* 'match_length' is constant for non-regexp boundaries. */ while (*--match_start != first_char - || (match_length1 && strncmp (match_start + 1, separator1, - match_length1))) + || (match_length1 && !STREQ_LEN (match_start + 1, separator1, + match_length1))) /* Do nothing. */ ; } diff --git a/src/who.c b/src/who.c index cc42d5f5bc..0a09411f4a 100644 --- a/src/who.c +++ b/src/who.c @@ -582,8 +582,8 @@ scan_entries (size_t n, const STRUCT_UTMP *utmp_buf) while (n--) { if (!my_line_only - || strncmp (ttyname_b, utmp_buf->ut_line, - sizeof (utmp_buf->ut_line)) == 0) + || STREQ_LEN (ttyname_b, utmp_buf->ut_line, + sizeof (utmp_buf->ut_line))) { if (need_users && IS_USER_PROCESS (utmp_buf)) print_user (utmp_buf, boottime); -- 2.47.2