Hi,

I was looking at making 'cut' operate on multibyte characters. Changing
expressions like this with multiple characters:

   if (c == last_c || /* More character comparisons.  */)

to this:

   if (mcel_cmp (g, last_g) != 0 || /* More character comparisons.  */)

got a bit difficult to read, in my opinion.

How about adding a mcel_eq function? Similar to streq, just using the
*cmp function under the hood.

Collin

>From 20e42952ae74f68c0499b77c298f7aa844fe54bb Mon Sep 17 00:00:00 2001
Message-ID: <20e42952ae74f68c0499b77c298f7aa844fe54bb.1764225493.git.collin.fu...@gmail.com>
From: Collin Funk <[email protected]>
Date: Wed, 26 Nov 2025 22:32:41 -0800
Subject: [PATCH] mcel: add mcel_eq.

* lib/mcel.h (mcel_eq): New function.
* tests/test-mcel.c (main): Add tests.
---
 ChangeLog         | 6 ++++++
 lib/mcel.h        | 7 +++++++
 tests/test-mcel.c | 9 +++++++++
 3 files changed, 22 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index e707767877..30bcb1162f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2025-11-26  Collin Funk  <[email protected]>
+
+	mcel: add mcel_eq.
+	* lib/mcel.h (mcel_eq): New function.
+	* tests/test-mcel.c (main): Add tests.
+
 2025-11-15  Basil L. Contovounesios  <[email protected]>
 
 	maintainer-makefile: Auto-detect NEWS.md.
diff --git a/lib/mcel.h b/lib/mcel.h
index 3e770c8c60..b65ea565af 100644
--- a/lib/mcel.h
+++ b/lib/mcel.h
@@ -185,6 +185,13 @@ mcel_cmp (mcel_t c1, mcel_t c2)
   return ((c1.err - c2.err) * (1 << MCEL_ERR_SHIFT)) + (ch1 - ch2);
 }
 
+/* Return true if C1 and C2 are equal.  */
+MCEL_INLINE int
+mcel_eq (mcel_t c1, mcel_t c2)
+{
+  return ! mcel_cmp (c1, c2);
+}
+
 /* Apply the uchar translator TO to C1 and C2 and compare the results,
    with encoding errors sorting after characters,
    Return <0, 0, >0 for <, =, >.  */
diff --git a/tests/test-mcel.c b/tests/test-mcel.c
index 03572b48a8..fb5d270f1d 100644
--- a/tests/test-mcel.c
+++ b/tests/test-mcel.c
@@ -58,11 +58,14 @@ main (int argc, char *argv[])
       ASSERT (c.len == 1);
       ASSERT (!c.err);
       ASSERT (mcel_cmp (c, c) == 0);
+      ASSERT (mcel_eq (c, c));
       ASSERT (mcel_tocmp (to_ascii, c, c) == 0);
       if (ch)
         {
           ASSERT (mcel_cmp (prev, c) < 0);
           ASSERT (mcel_cmp (c, prev) > 0);
+          ASSERT (! mcel_eq (prev, c));
+          ASSERT (! mcel_eq (c, prev));
           ASSERT (mcel_tocmp (to_ascii, prev, c) < 0);
           ASSERT (mcel_tocmp (to_ascii, c, prev) > 0);
         }
@@ -94,9 +97,12 @@ main (int argc, char *argv[])
       ASSERT (c.len == 2);
       ASSERT (!c.err);
       ASSERT (mcel_cmp (c, c) == 0);
+      ASSERT (mcel_eq (c, c));
       ASSERT (mcel_tocmp (to_ascii, c, c) == 0);
       ASSERT (mcel_cmp (prev, c) < 0);
       ASSERT (mcel_cmp (c, prev) > 0);
+      ASSERT (! mcel_eq (prev, c));
+      ASSERT (! mcel_eq (c, prev));
       ASSERT (mcel_tocmp (to_ascii, c, c) == 0);
       int cmp = to_ascii (c.ch) ? -1 : 1;
       ASSERT (sgn (mcel_tocmp (to_ascii, prev, c)) == cmp);
@@ -110,8 +116,11 @@ main (int argc, char *argv[])
       ASSERT (c.len == 1);
       ASSERT (c.err == err);
       ASSERT (mcel_cmp (c, c) == 0);
+      ASSERT (mcel_eq (c, c));
       ASSERT (mcel_cmp (prev, c) < 0);
       ASSERT (mcel_cmp (c, prev) > 0);
+      ASSERT (! mcel_eq (prev, c));
+      ASSERT (! mcel_eq (c, prev));
       ASSERT (mcel_tocmp (to_ascii, c, c) == 0);
       ASSERT (mcel_tocmp (to_ascii, prev, c) < 0);
       ASSERT (mcel_tocmp (to_ascii, c, prev) > 0);
-- 
2.52.0

Reply via email to