From: drh <> Date: Wed, 25 Sep 2024 09:43:05 +0000 (+0000) Subject: Merge trunk enhancements, and especially the zero- and double-width character X-Git-Tag: version-3.47.0~91^2~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f1f9ef09f20fbdb00a2ffac4c807cbce817b83d;p=thirdparty%2Fsqlite.git Merge trunk enhancements, and especially the zero- and double-width character processing for columnar outputs into the cli-stdlib branch. FossilOrigin-Name: d6262a4bcd7b0334b23ae4d194ca2bce7c6554ee6c678666b24c830e4c14a467 --- 8f1f9ef09f20fbdb00a2ffac4c807cbce817b83d diff --cc manifest index 42bba29152,e74bcacf3c..97936fe65a --- a/manifest +++ b/manifest @@@ -1,5 -1,5 +1,5 @@@ - C Fix\sover-length\slines\sin\sthe\sshell\ssource\scode. - D 2024-09-24T19:47:12.272 -C In\sthe\sCLI,\sfor\scolumnar\soutput\sformats,\stry\sto\saccount\sfor\sthe\spresence\sof\nzero-width\sand\sdouble-width\scharacters\sin\sthe\soutput\sand\sadjust\scolumn\swidths\naccordingly. -D 2024-09-25T09:39:11.501 ++C Merge\strunk\senhancements,\sand\sespecially\sthe\szero-\sand\sdouble-width\scharacter\nprocessing\sfor\scolumnar\soutputs\sinto\sthe\scli-stdlib\sbranch. ++D 2024-09-25T09:43:05.208 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@@ -767,10 -765,10 +767,10 @@@ F src/pragma.h e690a356c18e98414d2e870e F src/prepare.c 3ba0ad907b7773ed642f66cea8a2c9c8edc18841aa1050b6218dbb3479e86225 F src/printf.c 6a87534ebfb9e5346011191b1f3a7ebc457f5938c7e4feeea478ecf53f6a41b2 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c - F src/resolve.c b2cd748488012312824508639b6af908461e45403037d5c4e19d9b0e8195507f + F src/resolve.c 9750a281f7ba073b4e6da2be1a6c4071f5d841a7746c5fb3f70d6d793b6675ea F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 4b14337a2742f0c0beeba490e9a05507e9b4b12184b9cd12773501d08d48e3fe - F src/shell.c.in 59d96ef5df9ba2f1f1982267385486b0a3fe5d9c04bcf00db8341064a6aaf72f -F src/shell.c.in 9b68a945f3aafc78eac1a256a4a588a9310dbc61a0cd60378c5b7a78f789af50 ++F src/shell.c.in 3eb4e28de9e629adba14f2314c0051ea462770fdc04972f15a3922810fec5959 F src/sqlite.h.in 77f55bd1978a04a14db211732f0a609077cf60ba4ccf9baf39988f508945419c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 @@@ -2215,8 -2213,9 +2215,8 @@@ F vsixtest/vsixtest.tcl 6195aba1f12a5e1 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 - P aeef82e974c24071e3211588001a92c7f122fbaf02d9dcf7fa5aaf30d2729f64 - R e0249c26fc1dbc90ee636c7d58ded95a -P 42bb941584a1ac922ee6b0b6ecadce71c9259555563cf49913a6f820f3f9b887 b217e3004b58af0e777726bdd652b999ad41815261299ef4ce8f8d2f6b0afe8d -R 5fcf6775e686fdd76943c66cce860cb0 -T +closed b217e3004b58af0e777726bdd652b999ad41815261299ef4ce8f8d2f6b0afe8d ++P f3fdf76a0d3abeb5202f2b6f26318815396da7df680073955bde60b13f84e797 9592b9ba3ad7a842cdd4c4010da278485a6fdec7e811bda01ebe640162a8c3b6 ++R cb8cb8b7debcfd75af761c484fdbc0a1 U drh - Z d330d508deb5561f036eaedfc6533764 -Z af457fc67e3efab459ef7260d9a5da46 ++Z e3c77b1ca9fc0efcd7f2507f7b7e048d # Remove this line to create a well-formed Fossil manifest. diff --cc manifest.uuid index fd858c80cf,5d05a8c7ec..8afc0d5af4 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - f3fdf76a0d3abeb5202f2b6f26318815396da7df680073955bde60b13f84e797 -9592b9ba3ad7a842cdd4c4010da278485a6fdec7e811bda01ebe640162a8c3b6 ++d6262a4bcd7b0334b23ae4d194ca2bce7c6554ee6c678666b24c830e4c14a467 diff --cc src/shell.c.in index 6454c2d935,f40fdaecbc..cdcba084da --- a/src/shell.c.in +++ b/src/shell.c.in @@@ -629,19 -839,33 +793,33 @@@ int cli_wcswidth(const char *z) ** then right-justify the text. W is the width in UTF-8 characters, not ** in bytes. This is different from the %*.*s specification in printf ** since with %*.*s the width is measured in bytes, not characters. + ** + ** Take into account zero-width and double-width Unicode characters. + ** In other words, a zero-width character does not count toward the + ** the w limit. A double-width character counts as two. */ -static void utf8_width_print(int w, const char *zUtf){ +static void utf8_width_print(FILE *out, int w, const char *zUtf){ - int i; - int n; + const unsigned char *a = (const unsigned char*)zUtf; + unsigned char c; + int i = 0; + int n = 0; int aw = w<0 ? -w : w; if( zUtf==0 ) zUtf = ""; - for(i=n=0; zUtf[i]; i++){ - if( (zUtf[i]&0xc0)!=0x80 ){ - n++; - if( n==aw ){ - do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); + while( (c = a[i])!=0 ){ + if( (c&0xc0)==0xc0 ){ + int u; + int len = decodeUtf8(a+i, &u); + int x = cli_wcwidth(u); + if( x+n>aw ){ break; } + i += len; + n += x; + }else if( n>=aw ){ + break; + }else{ + n++; + i++; } } if( n>=aw ){