]> git.ipfire.org Git - thirdparty/git.git/commitdiff
convert trivial uses of strncmp() to starts_with()
authorJeff King <peff@peff.net>
Sat, 7 Jan 2023 13:26:18 +0000 (08:26 -0500)
committerJunio C Hamano <gitster@pobox.com>
Sun, 8 Jan 2023 01:34:35 +0000 (10:34 +0900)
It's more readable to use starts_with() instead of strncmp() to match a
prefix, as the latter requires a manually-computed length, and has the
funny "matching is zero" return value common to cmp functions.  This
patch converts several cases which were found with:

  git grep 'strncmp(.*, [0-9]*)'

But note that it doesn't convert all such cases. There are several where
the magic length number is repeated elsewhere in the code, like:

  /* handle "buf" which isn't NUL-terminated and might be too small */
  if (len >= 3 && !strncmp(buf, "foo", 3))

or:

  /* exact match for "foo", but within a larger string */
  if (end - buf == 3 && !strncmp(buf, "foo", 3))

While it would not produce the wrong outcome to use starts_with() in
these cases, we'd still be left with one instance of "3". We're better
to leave them for now, as the repeated "3" makes it clear that the two
are linked (there may be other refactorings that handle both, but
they're out of scope for this patch).

A few things to note while reading the patch:

  - all cases but one are trying to match, and so lose the extra "!".
    The case in the first hunk of urlmatch.c is not-matching, and hence
    gains a "!".

  - the case in remote-fd.c is matching the beginning of "connect foo",
    but we never look at str+8 to parse the "foo" part (which would make
    this a candidate for skip_prefix(), not starts_with()). This seems
    at first glance like a bug, but is a limitation of how remote-fd
    works.

  - the second hunk in urlmatch.c shows some cases adjacent to other
    strncmp() calls that are left. These are of the "exact match within
    a larger string" type, as described above.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/remote-fd.c
bundle-uri.c
ref-filter.c
urlmatch.c

index 91dfe07e06a1b9603dfd7a0d04f4b7866841d63f..b2a3980b1d51b2ec369c7bf758710357b34816c3 100644 (file)
@@ -40,7 +40,7 @@ static void command_loop(int input_fd, int output_fd)
                if (!strcmp(buffer, "capabilities")) {
                        printf("*connect\n\n");
                        fflush(stdout);
-               } else if (!strncmp(buffer, "connect ", 8)) {
+               } else if (starts_with(buffer, "connect ")) {
                        printf("\n");
                        fflush(stdout);
                        if (bidirectional_transfer_loop(input_fd,
index 36268dda172511250cdda7a24db8cfdb00548f6f..6462ab6deb9710dcc36d2179f6702828d25455e2 100644 (file)
@@ -620,7 +620,7 @@ static int config_to_packet_line(const char *key, const char *value, void *data)
 {
        struct packet_reader *writer = data;
 
-       if (!strncmp(key, "bundle.", 7))
+       if (starts_with(key, "bundle."))
                packet_write_fmt(writer->fd, "%s=%s", key, value);
 
        return 0;
index a24324123e727b762e2df915802920728ee8f63d..f8203c6b05254b624cf98e6d4590d07064cbb101 100644 (file)
@@ -1209,7 +1209,7 @@ static const char *copy_name(const char *buf)
 {
        const char *cp;
        for (cp = buf; *cp && *cp != '\n'; cp++) {
-               if (!strncmp(cp, " <", 2))
+               if (starts_with(cp, " <"))
                        return xmemdupz(buf, cp - buf);
        }
        return xstrdup("");
index b615adc923ae019b756e25a1cdcfb251333e69ff..620a648efc5e81ac8b233153ae504ba145d6ee8f 100644 (file)
@@ -209,7 +209,7 @@ static char *url_normalize_1(const char *url, struct url_info *out_info, char al
         */
        if (!url_len || strchr(":/?#", *url)) {
                /* Missing host invalid for all URL schemes except file */
-               if (strncmp(norm.buf, "file:", 5)) {
+               if (!starts_with(norm.buf, "file:")) {
                        if (out_info) {
                                out_info->url = NULL;
                                out_info->err = _("missing host and scheme is not 'file:'");
@@ -268,11 +268,11 @@ static char *url_normalize_1(const char *url, struct url_info *out_info, char al
                if (url == slash_ptr) {
                        /* Skip ":" port with no number, it's same as default */
                } else if (slash_ptr - url == 2 &&
-                          !strncmp(norm.buf, "http:", 5) &&
+                          starts_with(norm.buf, "http:") &&
                           !strncmp(url, "80", 2)) {
                        /* Skip http :80 as it's the default */
                } else if (slash_ptr - url == 3 &&
-                          !strncmp(norm.buf, "https:", 6) &&
+                          starts_with(norm.buf, "https:") &&
                           !strncmp(url, "443", 3)) {
                        /* Skip https :443 as it's the default */
                } else {