From: Pádraig Brady
Date: Mon, 23 Mar 2026 20:31:21 +0000 (+0000) Subject: cut: prefer c_isblank() to c32issep() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a78ef2b65c9416894eca705d94a5e8284f1d2c38;p=thirdparty%2Fcoreutils.git cut: prefer c_isblank() to c32issep() 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 --- diff --git a/src/cut.c b/src/cut.c index 0dc66c4ec1..e10b477fb2 100644 --- 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);