From: наб <nabijaczleweli@nabijaczleweli.xyz>
Cc: libc-alpha@sourceware.org
Subject: [PATCH v4 1/3] posix: add (failing) test for REG_STARTEND
Date: Mon, 8 May 2023 00:56:06 +0200 [thread overview]
Message-ID: <1d5642ecb4bb477c9fd7e1ebaee868fe4ccbefc7.1683500149.git.nabijaczleweli@nabijaczleweli.xyz> (raw)
[-- Attachment #1: Type: text/plain, Size: 6133 bytes --]
This test passes on NetBSD, the illumos gate, and musl
with https://www.openwall.com/lists/musl/2023/04/20/2;
it's nothing revolutionary and the behaviour it tests
is largely guaranteed by the 4.4BSD-Lite manual;
nevertheless, it currently fails with
tst-reg-startend.c: ^a: a^@c: no match$
tst-reg-startend.c: ^a: a^@c: wanted {1, 2}, got {1, 4}$
tst-reg-startend.c: ^a: abc: no match$
tst-reg-startend.c: ^a: abc: wanted {1, 2}, got {1, 4}$
tst-reg-startend.c: ^a.c$: a^@c: no match$
tst-reg-startend.c: ^a.c$: abc: no match$
tst-reg-startend.c: ^a.*c$: a^@c: no match$
tst-reg-startend.c: ^a.*c$: abc: no match$
tst-reg-startend.c: ^a[^c]c$: a^@c: no match$
tst-reg-startend.c: ^a[^c]c$: abc: no match$
tst-reg-startend.c: ^a..: a^@c: no match$
tst-reg-startend.c: ^a..: abc: no match$
tst-reg-startend.c: ..c: a^@c: no match$
The test may also be compiled stand-alone (-DSTANDALONE)
and on all platforms that have the interface
(hence the macro to initialise regmatch_ts,
which start with pointer fields on the illumos gate),
for ease of testing and inclusion in other test suites.
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
---
Resending after a week; clean rebase.
posix/Makefile | 1 +
posix/tst-reg-startend.c | 124 +++++++++++++++++++++++++++++++++++++++
2 files changed, 125 insertions(+)
create mode 100644 posix/tst-reg-startend.c
diff --git a/posix/Makefile b/posix/Makefile
index cc77e939ad..24aeb781ca 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -295,6 +295,7 @@ tests := \
tst-posix_spawn-setsid \
tst-preadwrite \
tst-preadwrite64 \
+ tst-reg-startend \
tst-regcomp-truncated \
tst-regex \
tst-regex2 \
diff --git a/posix/tst-reg-startend.c b/posix/tst-reg-startend.c
new file mode 100644
index 0000000000..c3bfac0359
--- /dev/null
+++ b/posix/tst-reg-startend.c
@@ -0,0 +1,124 @@
+/* Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include <assert.h>
+#include <locale.h>
+#include <string.h>
+#include <regex.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+
+#define M(s, e) (regmatch_t) {.rm_so = s, .rm_eo = e}
+#define MEQ(l, r) ((l).rm_so == (r).rm_so && (l).rm_eo == (r).rm_eo)
+
+static const regmatch_t bound = M(1, 4);
+
+static const char *const regex_ac[] =
+ {"^a", "c$", "^a.c$", "^a.*c$", "^a[^c]c$", "^a..", "..c", "[^z]c", NULL};
+static const char *const regex_aa[] =
+ {"^", "^a", "a$", "^\\(a\\).\\1$", "^a[^a]*", NULL};
+static const char *const data_ac[] = {"_a\0cdef", "_abcdef"};
+static const char *const data_aa[] = {"_a\0adef", "_abadef"};
+static const regmatch_t results_ac[] =
+ {M(1, 2), M(3, 4), M(1, 4), M(1, 4), M(1, 4), M(1, 4), M(1, 4), M(2, 4)};
+static const regmatch_t results_aa[] =
+ {M(1, 1), M(1, 2), M(3, 4), M(1, 4), M(1, 3)};
+static_assert(sizeof(regex_ac) / sizeof(*regex_ac) - 1 ==
+ sizeof(results_ac) / sizeof(*results_ac), "");
+static_assert(sizeof(regex_aa) / sizeof(*regex_aa) - 1 ==
+ sizeof(results_aa) / sizeof(*results_aa), "");
+
+
+static bool
+testbunch (const char *const *regexes, const char *const data[static 2],
+ const regmatch_t *results)
+{
+#define BASEERR(data) \
+ err = true, \
+ fprintf (stdout, __FILE__ ": %s: ", *regexes), \
+ fwrite (data[i] + bound.rm_so, 1, bound.rm_eo - bound.rm_so, stdout)
+
+ bool err = false;
+ for (; *regexes; ++regexes, ++results)
+ {
+ regex_t rgx;
+ assert (!regcomp (&rgx, *regexes, 0));
+
+ for (size_t i = 0; i < 2; ++i)
+ {
+ regmatch_t match = bound;
+ if (regexec (&rgx, data[i], 1, &match, REG_STARTEND))
+ BASEERR(data), fputs (": no match\n", stdout);
+
+ if (!MEQ(match, *results))
+ BASEERR(data), fprintf (stdout, ": wanted {%d, %d}, got {%d, %d}\n",
+ (int)results->rm_so, (int)results->rm_eo,
+ (int)match.rm_so, (int)match.rm_eo);
+ }
+
+ regfree(&rgx);
+ }
+
+ return err;
+}
+
+
+static const char *const mb_data[2] = {"_aaćdef", "_aćdef"};
+static const bool mb_exp[] = {false, true};
+
+static bool
+testmb (void)
+{
+ bool err = false;
+ regex_t rgx;
+ const char *const regexes[] = {"ać"};
+ assert (!regcomp (&rgx, *regexes, 0));
+
+ for (size_t i = 0; i < 2; ++i)
+ {
+ regmatch_t match = bound;
+ if (regexec (&rgx, mb_data[i], 1, &match, REG_STARTEND) == mb_exp[i])
+ BASEERR(mb_data), fprintf (stdout, ": %s match\n",
+ mb_exp[i] ? "no" : "yes");
+
+ if (!MEQ(match, bound))
+ BASEERR(mb_data), fprintf (stdout, ": wanted {%d, %d}, got {%d, %d}\n",
+ (int)bound.rm_so, (int)bound.rm_eo,
+ (int)match.rm_so, (int)match.rm_eo);
+ }
+
+ regfree(&rgx);
+ return err;
+}
+
+
+static int
+do_test (int argc, char **argv)
+{
+ (void) argc, (void) argv;
+ assert (setlocale (LC_ALL, "C.UTF-8"));
+
+ return testbunch (regex_ac, data_ac, results_ac) ||
+ testbunch (regex_aa, data_aa, results_aa) ||
+ testmb ();
+}
+
+
+#ifndef STANDALONE
+#include "../test-skeleton.c"
+#else
+int
+main(int argc, char **argv)
+{
+ return do_test(argc, argv);
+}
+#endif
--
2.30.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next reply other threads:[~2023-05-07 22:56 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-07 22:56 наб [this message]
2023-05-07 22:56 ` [PATCH v4 2/3] posix: regcomp(): clear RE_DOT_NOT_NULL наб
2023-05-07 22:56 ` [PATCH v4 3/3] posix: regexec(): fix REG_STARTEND, pmatch->rm_so != 0 w/^ anchor наб
2023-05-29 18:11 ` Adhemerval Zanella Netto
2023-05-29 13:22 ` [PATCH v5 1/3] posix: add (failing) test for REG_STARTEND наб
2023-05-29 13:22 ` [PATCH v5 2/3] posix: regcomp(): clear RE_DOT_NOT_NULL наб
2023-05-29 13:22 ` [PATCH v5 3/3] posix: regexec(): fix REG_STARTEND, pmatch->rm_so != 0 w/^ anchor наб
2023-05-29 17:37 ` [PATCH v4 1/3] posix: add (failing) test for REG_STARTEND Adhemerval Zanella Netto
2023-05-29 20:10 ` наб
2023-05-29 20:23 ` Adhemerval Zanella Netto
2023-06-12 0:47 ` [PATCH v7 1/3] posix: regcomp(): clear RE_DOT_NOT_NULL наб
2023-06-12 13:11 ` Carlos O'Donell
2023-06-12 0:47 ` [PATCH v7 2/3] posix: regexec(): fix REG_STARTEND, pmatch->rm_so != 0 w/^ anchor наб
2023-06-12 13:11 ` Carlos O'Donell
2023-06-12 14:03 ` наб
2023-06-12 0:47 ` [PATCH v7 3/3] posix: add test for REG_STARTEND наб
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1d5642ecb4bb477c9fd7e1ebaee868fe4ccbefc7.1683500149.git.nabijaczleweli@nabijaczleweli.xyz \
--to=nabijaczleweli@nabijaczleweli.xyz \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).