From: drh <> Date: Sat, 31 May 2025 20:51:42 +0000 (+0000) Subject: Enhance "box" and "column" mode formatting in the CLI to better deal with X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c0190101d14bca3664689c53b432c4de969905a2;p=thirdparty%2Fsqlite.git Enhance "box" and "column" mode formatting in the CLI to better deal with double-wide characters. FossilOrigin-Name: b0de22ed0abf2ea5d269f191c884d7b2be167a2ed27018c25aaa0ea238cd621a --- diff --git a/manifest b/manifest index db32e86435..3801f5988e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\smakefile\starget\s"xdevtest"\sworks\slike\s"releasetest"\sexcept\sthat\sit\nomits\sthe\s"verify-source"\sdependency\sso\sthat\sit\scan\sbe\srun\swith\suncommitted\nchanges\sin\sthe\ssource\stree. -D 2025-05-31T18:26:37.671 +C Enhance\s"box"\sand\s"column"\smode\sformatting\sin\sthe\sCLI\sto\sbetter\sdeal\swith\ndouble-wide\scharacters. +D 2025-05-31T20:51:42.476 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -786,7 +786,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c d40fe18d7c2fd0339f5846ffcf7d6809866e380acdf14c76fb2af87e9fe13f64 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 9929e56e78f958657bfbb8234916473468243f90af359cc646d97c3ee809c79c -F src/shell.c.in ba53a52dafb167ac6320703da741386c34fbcabe8c078a188bb9f89808e3ef8f +F src/shell.c.in 1da613953db4c8d50e3a4a66fa7d69b4c95edb3628941d732637d3c35ea0dce6 F src/sqlite.h.in 22882ddd3a70751aa8864c81993ee4562ed54c2c508b6270f75e223ffee38e1b F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 0bfd049bb2088cc44c2ad54f2079d1c6e43091a4e1ce8868779b75f6c1484f1e @@ -1084,6 +1084,7 @@ F test/dbfuzz.c fc566102f72c8af84ae8077b4faf7f056c571e6fa7a32e98b66e42b7505f47b6 F test/dbfuzz001.test 6c9a4622029d69dc38926f115864b055cb2f39badd25ec22cbfb130c8ba8e9c3 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c 4b3c12de4d98b1b2d908ab03d217d4619e47c8b23d5e67f8a6f2b1bdee7cae23 +F test/dblwidth-a.sql eb4141518610e52f931a55a984310075e98dc31eee5a28ae806b1e35377be85a F test/dbpage.test 63fab1eb026bada121107e53436fa749bbf83281dc9dea17af422f7a5c0f289f F test/dbpagefault.test ea39de2ca86041a9c6df1135645180a76d0a8da93ac159e2fafe38e39636530b F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 @@ -2207,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8d393ca07fe09f48d77adb517e2e4baaa58a9251422de62a0504999205d3ea1d -R 9b94db4e5d892a93cf1670d233c18f80 +P 1afb1ac3e9f0a122f1374799c09b60a0dd5443434d4567d94385096ada91bf12 +R 241d4fe28f71a66e02a0774aedd929d3 U drh -Z 1c2aee3d74e96a6684f9847b4822e599 +Z 36464e257b6f6b054003c79b6284e296 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index effd39b1f3..cebff17bad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1afb1ac3e9f0a122f1374799c09b60a0dd5443434d4567d94385096ada91bf12 +b0de22ed0abf2ea5d269f191c884d7b2be167a2ed27018c25aaa0ea238cd621a diff --git a/src/shell.c.in b/src/shell.c.in index 8660bd78a2..363685eb0d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -887,12 +887,21 @@ static int strlen30(const char *z){ /* ** Return the length of a string in characters. Multibyte UTF8 characters -** count as a single character. +** count as a single character for single-width characters, or as two +** characters for double-width characters. */ static int strlenChar(const char *z){ int n = 0; while( *z ){ - if( (0xc0&*(z++))!=0x80 ) n++; + if( (0x80&z[0])==0 ){ + n++; + z++; + }else{ + int u = 0; + int len = decodeUtf8((const u8*)z, &u); + z += len; + n += cli_wcwidth(u); + } } return n; } diff --git a/test/dblwidth-a.sql b/test/dblwidth-a.sql new file mode 100644 index 0000000000..38c219698d --- /dev/null +++ b/test/dblwidth-a.sql @@ -0,0 +1,20 @@ +/* +** Run this script using "sqlite3" to confirm that the command-line +** shell properly handles the output of double-width characters. +** +** https://sqlite.org/forum/forumpost/008ac80276 +*/ +.mode box +CREATE TABLE data(word TEXT, description TEXT); +INSERT INTO data VALUES('〈οὐκέτι〉','Greek without dblwidth <...>'); +.print .mode box +SELECT * FROM data; +.mode table +.print .mode table +SELECT * FROM data; +.mode qbox +.print .mode qbox +SELECT * FROM data; +.mode column +.print .mode column +SELECT * FROM data;