]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cut: prefer c_isblank() to c32issep()
authorPádraig Brady <P@draigBrady.com>
Mon, 23 Mar 2026 20:31:21 +0000 (20:31 +0000)
committerPádraig Brady <P@draigBrady.com>
Sun, 5 Apr 2026 12:15:56 +0000 (13:15 +0100)
12% perf increase with:

$ time src/cut -f2 -w ll.in >/dev/null
real 0m6.469s

$ time src/cut -f2 -w ll.in >/dev/null
real 0m5.689s

src/cut.c

index 0dc66c4ec1b508aafb06065e54d4eb1726a9faa3..e10b477fb25a09b73db14535f43ee9bd47711053 100644 (file)
--- a/src/cut.c
+++ b/src/cut.c
@@ -314,6 +314,14 @@ utf8_field_delim_ok (void)
   return ! delim_mcel.err && is_utf8_charset ();
 }
 
+static bool
+mcel_isblank (mcel_t g)
+{
+  /* This is faster than calling c32issep directly.
+     Assume all unibyte locales match c_isblank.  */
+  return (g.len == 1 && c_isblank (g.ch)) || (g.len > 1 && c32issep (g.ch));
+}
+
 static inline bool
 bytesearch_field_delim_ok (void)
 {
@@ -387,7 +395,7 @@ skip_whitespace_run (mbbuf_t *mbuf, struct mbfield_parser *parser,
       if (g.ch != MBBUF_EOF)
         *have_pending_line = true;
     }
-  while (g.ch != MBBUF_EOF && g.ch != line_delim && c32issep (g.ch));
+  while (g.ch != MBBUF_EOF && g.ch != line_delim && mcel_isblank (g));
 
   bool trim_start = parser->trim_outer_whitespace && parser->at_line_start;
 
@@ -472,7 +480,7 @@ mbfield_terminator (mbbuf_t *mbbuf, struct mbfield_parser *parser, mcel_t g,
     return FIELD_LINE_DELIMITER;
 
   if (parser->whitespace_delimited)
-    return (c32issep (g.ch)
+    return (mcel_isblank(g)
             ? skip_whitespace_run (mbbuf, parser, have_pending_line, true)
             : FIELD_DATA);