From nobody Sun Mar 1 11:29:00 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4fP0FS44Mzz6Sncn for ; Sun, 01 Mar 2026 11:29:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fP0FS3VVWz3srK for ; Sun, 01 Mar 2026 11:29:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1772364540; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Igtu86OiRk7VNAX0qXm1LBrK68m5paYOv6sLAQIX3BM=; b=UAzDPm/o0fr3gMK6hh0UWKa1MGmWQ/C4NrT9uaNVKQ7LAVC82ol/83vR1U+ndtyR3gkjvV Px1mgFO1b9t+BD3FzD5ClqUqHBjIsPvBHHQcJK4CdJYtQ6buA47XsdwtJG6F2w9nTUrXWJ KbSqmOJQYbBnKkT2ID0CjRB6QyXyOsKlmY7oYuxjC2GTODcDSotGTtbhFH2l9tyuAUMudQ 4AiSQCWJtk2Z9N5USPUyYQY9eGxhieSD34v3wvqCiHr+zU3vlABxvZ6dilnn74gI/vgN1G qHWW14/kn4dmKgw93m6/mHYAdL/4/ibxceQx0TqXy6uxbhP7hyXdtihkKP10UQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1772364540; a=rsa-sha256; cv=none; b=pvAlL1cXqU3NNhVhw3wVHNM6nJbxpGNfnk+ZxYDyGPJ9FIVPl2DI7hLT11mQUWdpPILU70 Q9cRfxmWGohopkxaxuHiB8wQM3dBm8thF5KED8GRixmpLJzhTPJg/51fs0y7+7CScU7CU9 KkHfK5MYYwOGu7rGDzxAk0c3nrWShih1Xvamfq/N5EvCtuGCtE+fCzWvw1mJ7hLVbzd5Ze zGDiSR13t0EGlqkXDrb9fFeI48jxg5jNZ2c3gMs1XFhiRqA8N5GiRb7rLjRHF+aST8CEXT n75+NFPpP0+s9KJd2srTkJDLB7DJYzBGmpCjSAqhII98vmEDZgMQtCOETmwrQA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1772364540; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Igtu86OiRk7VNAX0qXm1LBrK68m5paYOv6sLAQIX3BM=; b=Lsfg5usHka3Xjp9YNC1b2Y8l4K+cJa+vSBzb6xUFnK/H7GDyeqB6dJbTfIfT4WvtUidM6z GjklnxbnXPS4hFO4Xg+PoKhsRAEKI1IVVF3wY7o0BjfTu1EyDh5WKKVVa52EMH7f/xdpjI 9qp/OHDzcrvPSyHJivSf+RiqJEW05nn/oQ6AnkR2a82GOdJOEpKSDiByoxERnXO1uRtMTT RNdKMZHRu01/lxH5hjs89tvvLA2Rg+5w5JIWWP3tED6HYzQUTuyDKYcZPDlfqGlteMNevL QaYyCNSCl/DQ+DIpZ0qhMy3JnH76MTZoPJjMmhVqA22d0dTrlx5WzDjF0nCt0w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fP0FS345vzmx4 for ; Sun, 01 Mar 2026 11:29:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 39a3b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 01 Mar 2026 11:29:00 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Baptiste Daroussin Subject: git: 5df6aca10906 - main - ed: add unicode support for the l (list) command List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bapt X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5df6aca10906f669bc7095ff735eba6b8fe95ff0 Auto-Submitted: auto-generated Date: Sun, 01 Mar 2026 11:29:00 +0000 Message-Id: <69a422fc.39a3b.73b7b4c1@gitrepo.freebsd.org> The branch main has been updated by bapt: URL: https://cgit.FreeBSD.org/src/commit/?id=5df6aca10906f669bc7095ff735eba6b8fe95ff0 commit 5df6aca10906f669bc7095ff735eba6b8fe95ff0 Author: Baptiste Daroussin AuthorDate: 2026-02-17 15:25:46 +0000 Commit: Baptiste Daroussin CommitDate: 2026-03-01 11:28:29 +0000 ed: add unicode support for the l (list) command Use mbrtowc()/iswprint()/wcwidth() in put_tty_line() so that the l command displays valid multibyte characters as-is instead of escaping each byte as octal. Column wrapping now correctly accounts for character display width (including double-width CJK characters). Invalid or incomplete UTF-8 sequences and non-printable characters are still escaped as octal. Differential Revision: https://reviews.freebsd.org/D55365 --- bin/ed/ed.h | 2 ++ bin/ed/io.c | 70 +++++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/bin/ed/ed.h b/bin/ed/ed.h index e1e41cf3fe40..fdfaf47acb4f 100644 --- a/bin/ed/ed.h +++ b/bin/ed/ed.h @@ -36,6 +36,8 @@ #include #include #include +#include +#include #define ERR (-2) #define EMOD (-3) diff --git a/bin/ed/io.c b/bin/ed/io.c index b3262ea9e217..3a1b6d8bb443 100644 --- a/bin/ed/io.c +++ b/bin/ed/io.c @@ -298,13 +298,49 @@ put_tty_line(const char *s, int l, long n, int gflag) int col = 0; int lc = 0; char *cp; + wchar_t wc; + mbstate_t mbs; + size_t clen; + int w; if (gflag & GNP) { printf("%ld\t", n); col = 8; } - for (; l--; s++) { - if ((gflag & GLS) && ++col > cols) { + for (; l > 0;) { + if (!(gflag & GLS)) { + putchar(*s++); + l--; + continue; + } + /* GLS mode: try to decode a multibyte character */ + memset(&mbs, 0, sizeof(mbs)); + clen = mbrtowc(&wc, s, l, &mbs); + if (clen != (size_t)-1 && clen != (size_t)-2 && + clen > 1 && iswprint(wc) && (w = wcwidth(wc)) >= 0) { + /* printable multibyte character */ + if (col + w > cols) { + fputs("\\\n", stdout); + col = 0; +#ifndef BACKWARDS + if (!scripted && !isglobal && ++lc > rows) { + lc = 0; + fputs("Press to continue... ", + stdout); + fflush(stdout); + if (get_tty_line() < 0) + return ERR; + } +#endif + } + col += w; + fwrite(s, 1, clen, stdout); + s += clen; + l -= clen; + continue; + } + /* single byte: ASCII printable, escape sequence, or octal */ + if (++col > cols) { fputs("\\\n", stdout); col = 1; #ifndef BACKWARDS @@ -317,24 +353,22 @@ put_tty_line(const char *s, int l, long n, int gflag) } #endif } - if (gflag & GLS) { - if (31 < *s && *s < 127 && *s != '\\') - putchar(*s); + if (31 < *s && *s < 127 && *s != '\\') + putchar(*s); + else { + putchar('\\'); + col++; + if (*s && (cp = strchr(ESCAPES, *s)) != NULL) + putchar(ESCCHARS[cp - ESCAPES]); else { - putchar('\\'); - col++; - if (*s && (cp = strchr(ESCAPES, *s)) != NULL) - putchar(ESCCHARS[cp - ESCAPES]); - else { - putchar((((unsigned char) *s & 0300) >> 6) + '0'); - putchar((((unsigned char) *s & 070) >> 3) + '0'); - putchar(((unsigned char) *s & 07) + '0'); - col += 2; - } + putchar((((unsigned char) *s & 0300) >> 6) + '0'); + putchar((((unsigned char) *s & 070) >> 3) + '0'); + putchar(((unsigned char) *s & 07) + '0'); + col += 2; } - - } else - putchar(*s); + } + s++; + l--; } #ifndef BACKWARDS if (gflag & GLS)