pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/pkgtools/check-portability pkgtools/check-portability:...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/e0e42ca229dc
branches:  trunk
changeset: 412792:e0e42ca229dc
user:      rillig <rillig%pkgsrc.org@localhost>
date:      Thu Mar 12 08:42:34 2020 +0000

description:
pkgtools/check-portability: update to 19.4.1

Changes since 19.4.0:

* Makefile.am and Makefile.in are checked even though they don't start
  with a #! line.
* Only shell programs with an interpreter that is clearly a POSIX shell
  are checked. Before, there was a blacklist of interpreters to be
  skipped.
* Lots of refactorings and code cleanups.
* Some additional test files.

diffstat:

 pkgtools/check-portability/Makefile                       |    6 +-
 pkgtools/check-portability/files/check-portability.c      |  361 +++++++------
 pkgtools/check-portability/files/test-double-brackets.sh  |   18 -
 pkgtools/check-portability/files/test-random.sh           |   15 -
 pkgtools/check-portability/files/test-test-eqeq.sh        |   18 -
 pkgtools/check-portability/files/testdata/Makefile.am     |    8 +
 pkgtools/check-portability/files/testdata/double-brackets |   18 +
 pkgtools/check-portability/files/testdata/env-sh          |    8 +
 pkgtools/check-portability/files/testdata/interp-ok       |    7 +
 pkgtools/check-portability/files/testdata/random          |   15 +
 pkgtools/check-portability/files/testdata/test-eqeq       |   18 +
 11 files changed, 272 insertions(+), 220 deletions(-)

diffs (truncated from 690 to 300 lines):

diff -r 7a89540a0e03 -r e0e42ca229dc pkgtools/check-portability/Makefile
--- a/pkgtools/check-portability/Makefile       Thu Mar 12 07:52:00 2020 +0000
+++ b/pkgtools/check-portability/Makefile       Thu Mar 12 08:42:34 2020 +0000
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.3 2020/03/12 00:05:36 rillig Exp $
+# $NetBSD: Makefile,v 1.4 2020/03/12 08:42:34 rillig Exp $
 
-PKGNAME=       check-portability-19.4.0
+PKGNAME=       check-portability-19.4.1
 CATEGORIES=    pkgtools
 DISTFILES=     # none
 
@@ -10,7 +10,7 @@
 LICENSE=       2-clause-bsd
 
 USE_TOOLS+=            pax
-CHECK_PORTABILITY_SKIP=        test-*.sh
+CHECK_PORTABILITY_SKIP=        testdata/*
 USE_LANGUAGES=         c99
 USE_BSD_MAKEFILE=      yes
 AUTO_MKDIRS=           yes
diff -r 7a89540a0e03 -r e0e42ca229dc pkgtools/check-portability/files/check-portability.c
--- a/pkgtools/check-portability/files/check-portability.c      Thu Mar 12 07:52:00 2020 +0000
+++ b/pkgtools/check-portability/files/check-portability.c      Thu Mar 12 08:42:34 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: check-portability.c,v 1.3 2020/03/11 23:36:32 rillig Exp $ */
+/* $NetBSD: check-portability.c,v 1.4 2020/03/12 08:42:34 rillig Exp $ */
 
 /*
  Copyright (c) 2020 Roland Illig
@@ -38,6 +38,19 @@
 #define nullptr ((void *)0)
 static const size_t npos = -1;
 
+static bool
+is_alnum(char c)
+{
+       return isalnum((unsigned char) c) != 0;
+}
+
+static bool
+is_hspace(char c)
+{
+       return c == ' ' || c == '\t';
+}
+
+// cstr is a constant string view.
 typedef struct {
        const char *data; // never nullptr
        size_t len;
@@ -45,20 +58,6 @@
 
 #define CSTR(str) ((cstr) { str, strlen(str) })
 
-typedef struct {
-       char *data;
-       size_t len;
-       size_t cap;
-} str;
-
-#define STR_EMPTY { nullptr, 0, 0 }
-
-static bool
-is_alnum(char c)
-{
-       return isalnum((unsigned char) c) != 0;
-}
-
 static const char *
 cstr_charptr(cstr s)
 {
@@ -67,6 +66,7 @@
        return s.data;
 }
 
+#if 0 /* unused */
 static bool
 cstr_ends_with(cstr s, cstr suffix)
 {
@@ -75,6 +75,98 @@
        const char *start = s.data + s.len - suffix.len;
        return memcmp(start, suffix.data, suffix.len) == 0;
 }
+#endif
+
+static bool
+cstr_starts_with(cstr s, cstr prefix)
+{
+       if (prefix.len > s.len)
+               return false;
+       return memcmp(s.data, prefix.data, prefix.len) == 0;
+}
+
+static cstr
+cstr_substr(cstr s, size_t start, size_t end)
+{
+       assert(start <= s.len);
+       assert(end <= s.len);
+       assert(end - start <= s.len);
+       return (cstr) { s.data + start, end - start };
+}
+
+static size_t
+cstr_index(cstr haystack, cstr needle)
+{
+       if (needle.len > haystack.len)
+               return npos;
+       size_t limit = haystack.len - needle.len;
+       for (size_t i = 0; i <= limit; i++)
+               if (memcmp(haystack.data + i, needle.data, needle.len) == 0)
+                       return i;
+       return npos;
+}
+
+static bool
+cstr_contains(cstr haystack, cstr needle)
+{
+       return cstr_index(haystack, needle) != npos;
+}
+
+static size_t
+cstr_rindex(cstr haystack, cstr needle)
+{
+       if (needle.len > haystack.len)
+               return npos;
+       size_t limit = haystack.len - needle.len;
+       for (size_t i = limit + 1; i-- > 0; )
+               if (memcmp(haystack.data + i, needle.data, needle.len) == 0)
+                       return i;
+       return npos;
+}
+
+static bool
+cstr_eq(cstr s1, cstr s2)
+{
+       return s1.len == s2.len
+           && memcmp(s1.data, s2.data, s1.len) == 0;
+}
+
+static cstr
+cstr_next_field(cstr line, size_t *pidx)
+{
+       size_t idx = *pidx;
+       while (idx < line.len && is_hspace(line.data[idx]))
+               idx++;
+       size_t start = idx;
+       while (idx < line.len && !is_hspace(line.data[idx]))
+               idx++;
+       *pidx = idx;
+       return cstr_substr(line, start, idx);
+}
+
+static cstr
+cstr_right_of_last(cstr s, cstr delimiter)
+{
+       size_t i = cstr_rindex(s, delimiter);
+       if (i == npos)
+               return s;
+       return cstr_substr(s, i + delimiter.len, s.len);
+}
+
+// str is a modifiable string buffer.
+typedef struct {
+       char *data;
+       size_t len;
+       size_t cap;
+} str;
+
+#define STR_EMPTY { nullptr, 0, 0 }
+
+static cstr
+str_c(str *s)
+{
+       return (cstr) { s->data, s->len };
+}
 
 static void
 str_free(str *s)
@@ -83,7 +175,7 @@
 }
 
 static void
-str_prepare_append(str *s, size_t n)
+str_reserve(str *s, size_t n)
 {
        size_t req_len = s->len + n;
        assert(req_len >= s->len);
@@ -104,29 +196,23 @@
        s->cap = new_cap;
 }
 
+static void
+str_append_char(str *s, char c)
+{
+       str_reserve(s, 1);
+       s->data[s->len++] = c;
+}
+
 static const char *
 str_charptr(str *s)
 {
-       str_prepare_append(s, 1);
+       str_reserve(s, 1);
        s->data[s->len] = '\0';
        assert(memchr(s->data, 0, s->len) == nullptr);
        return s->data;
 }
 
 static bool
-cstr_starts_with(cstr s, cstr prefix)
-{
-       return prefix.len <= s.len && memcmp(s.data, prefix.data, prefix.len) == 0;
-}
-
-static void
-str_append_char(str *s, char c)
-{
-       str_prepare_append(s, 1);
-       s->data[s->len++] = c;
-}
-
-static bool
 str_read_line(str *s, FILE *f)
 {
        int c;
@@ -151,64 +237,6 @@
        return c != EOF;
 }
 
-static cstr
-str_c(str *s)
-{
-       return (cstr) { s->data, s->len };
-}
-
-static cstr
-cstr_substr(cstr s, size_t start, size_t end)
-{
-       return (cstr) { s.data + start, end - start };
-}
-
-static bool
-is_hspace(char c)
-{
-       return c == ' ' || c == '\t';
-}
-
-static size_t
-cstr_index(cstr haystack, cstr needle)
-{
-       if (needle.len > haystack.len)
-               return npos;
-       size_t limit = haystack.len - needle.len;
-       for (size_t i = 0; i <= limit; i++)
-               if (memcmp(haystack.data + i, needle.data, needle.len) == 0)
-                       return i;
-       return npos;
-}
-
-static bool
-cstr_contains(cstr haystack, cstr needle)
-{
-       return cstr_index(haystack, needle) != npos;
-}
-
-static size_t
-cstr_rindex(cstr haystack, cstr needle)
-{
-       size_t i = cstr_index(haystack, needle);
-       if (i == npos)
-               return npos;
-
-       while (true) {
-               cstr rest = cstr_substr(haystack, i + 1, haystack.len);
-               size_t next = cstr_index(rest, needle);
-               if (next == npos)
-                       return i;
-               i = i + 1 + next;
-       }
-}
-
-static bool
-cstr_eq(cstr s1, cstr s2)
-{
-       return s1.len == s2.len && memcmp(s1.data, s2.data, s1.len) == 0;
-}
-
 typedef enum {
        W_dollar_random,
        W_test_eqeq,
@@ -266,11 +294,13 @@
 static bool
 is_shell_comment(cstr line)
 {
-       return line.len > 0 && line.data[0] == '#';
+       size_t i = 0;
+       cstr f1 = cstr_next_field(line, &i);
+       return cstr_starts_with(f1, CSTR("#"));
 }
 



Home | Main Index | Thread Index | Old Index