]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improvements to the syntax hints in the continuation prompt of the CLI
authordrh <>
Thu, 2 Apr 2026 11:43:04 +0000 (11:43 +0000)
committerdrh <>
Thu, 2 Apr 2026 11:43:04 +0000 (11:43 +0000)
FossilOrigin-Name: 5c544f169680804c9652b8f9fc843a4bac052706be6bac205baf13a8c83fc840

manifest
manifest.tags
manifest.uuid
src/shell.c.in

index dee8022439067f1a08146c9a0e34b7149941feda..2344aa0734421a667ebb9615ba59c4b0a3dc5075 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Always\suse\ssqlite3_malloc64()\sin\sextensions,\swhere\spossible.
-D 2026-04-01T16:56:48.155
+C Improvements\sto\sthe\ssyntax\shints\sin\sthe\scontinuation\sprompt\sof\sthe\sCLI
+D 2026-04-02T11:43:04.587
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -735,7 +735,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 928ff887f2a7c64275182060d94d06fdddbe32226c569781cf7e7edc6f58d7fd
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c ffe199f025a0dd74670d2a77232bdea364a4d7b36f32c64a6572d39ba6a11576
-F src/shell.c.in 91ee40ec3f75192362cbaa0ad85316140b8dde00a184113d73a837fb6173dbcc
+F src/shell.c.in fd7a7e7ddeaeec5ecda9ddcba5fa336bbc60f4024c54542dc1e85e00c1d67ef2
 F src/sqlite.h.in 9cc1df08742989eb67ed2065f73a582195c48fee2eec5df9df122b33d4872885
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 1b7a0ee438bb5c2896d0609c537e917d8057b3340f6ad004d2de44f03e3d3cca
@@ -2197,8 +2197,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 91ead3c62dd7b1db3fdfd318e3c35a42fb33e8fa2e347b682eecbff2f4e8677b
-R 6ba98470db6b05f2faea33c928a02358
+P 6194f3b5314ef98b5d73060450de8e3497272494b47e6f96992453418894ded1
+R ad9575498347584523c956e285476300
+T *branch * cli-prompt
+T *sym-cli-prompt *
+T -sym-trunk *
 U drh
-Z 794fc55ed4b29b8614c8a579512409b7
+Z 39d54ce0e0b0fb1346202fa0ae4a8eab
 # Remove this line to create a well-formed Fossil manifest.
index bec971799ff1b8ee641c166c7aeb22d12c785393..dd3d6d7cb35e72921de3fe051572b2905f0a9b75 100644 (file)
@@ -1,2 +1,2 @@
-branch trunk
-tag trunk
+branch cli-prompt
+tag cli-prompt
index 7761c3627bf7aca23f09abfbbb508e6b85d85d06..0046bf28581f264aa543f7be35771cf2ab22ae54 100644 (file)
@@ -1 +1 @@
-6194f3b5314ef98b5d73060450de8e3497272494b47e6f96992453418894ded1
+5c544f169680804c9652b8f9fc843a4bac052706be6bac205baf13a8c83fc840
index c931055ca2c7b961b25e99ea7476f768a56fa210..3b170d7c66e61206be9245f4ffe7f0a0834ab623 100644 (file)
@@ -811,14 +811,6 @@ static char *shell_strncpy(char *dest, const char *src, size_t n){
   return dest;
 }
 
-/*
-** strcpy() workalike to squelch an unwarranted link-time warning
-** from OpenBSD.
-*/
-static void shell_strcpy(char *dest, const char *src){
-  while( (*(dest++) = *(src++))!=0 ){}
-}
-
 /*
 ** Optionally disable dynamic continuation prompt.
 ** Unless disabled, the continuation prompt shows open SQL lexemes if any,
@@ -876,31 +868,41 @@ static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
 
 /* Upon demand, derive the continuation prompt to display. */
 static char *dynamicContinuePrompt(void){
-  if( continuePrompt[0]==0
-      || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
+  int k;         /* Number of context hint characters */
+  int nSpace;    /* Spaces at the start of continuePrompt */
+  int nDot;      /* Dots following spaces */
+  int nOrig;     /* Total size of continuePrompt in bytes */
+  int nCore;     /* nOrig + 1 - nSpace */
+
+  nOrig = (int)strlen(continuePrompt);
+  if( nOrig<=1
+   || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0)
+  ){
     return continuePrompt;
-  }else{
-    if( dynPrompt.zScannerAwaits ){
-      size_t ncp = strlen(continuePrompt);
-      size_t ndp = strlen(dynPrompt.zScannerAwaits);
-      if( ndp > ncp-3 ) return continuePrompt;
-      shell_strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits);
-      while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
-      shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
-              PROMPT_LEN_MAX-4);
-    }else{
-      if( dynPrompt.inParenLevel>9 ){
-        shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
-      }else if( dynPrompt.inParenLevel<0 ){
-        shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
-      }else{
-        shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
-        dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
-      }
-      shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
-                    PROMPT_LEN_MAX-4);
+  }
+  for(nSpace=0; continuePrompt[nSpace]==' '; nSpace++){}
+  for(nDot=0; continuePrompt[nSpace+nDot]=='.'; nDot++){}
+  nCore = nOrig + 1 - nSpace;
+  for(k=0; k<dynPrompt.inParenLevel && k+nCore<PROMPT_LEN_MAX; k++){
+    dynPrompt.dynamicPrompt[k] = '(';
+  }
+  if( dynPrompt.zScannerAwaits ){
+    int i = 0;
+    const char *z = dynPrompt.zScannerAwaits;
+    while( z[i] && k+nCore<PROMPT_LEN_MAX ){
+      dynPrompt.dynamicPrompt[k++] = z[i++];
     }
   }
+  while( k<nSpace ){
+    dynPrompt.dynamicPrompt[k++] = ' ';
+  }
+  if( k>nSpace && nDot ){
+    nSpace++;
+    nDot--;
+  }
+  memcpy(&dynPrompt.dynamicPrompt[k],
+         &continuePrompt[nSpace],
+         nCore);
   return dynPrompt.dynamicPrompt;
 }
 #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
@@ -12125,8 +12127,10 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss,
         }
         break;
       case '[':
-        cin = ']';
-        deliberate_fall_through; /* FALLTHRU */
+        cWait = ']';
+        qss = QSS_HasDark | cWait;
+        CONTINUE_PROMPT_AWAITC(pst, cin);
+        goto TermScan;
       case '`': case '\'': case '"':
         cWait = cin;
         qss = QSS_HasDark | cWait;