]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Clean-ups in prompt generation in the CLI. cli-prompt
authordrh <>
Thu, 9 Apr 2026 18:51:09 +0000 (18:51 +0000)
committerdrh <>
Thu, 9 Apr 2026 18:51:09 +0000 (18:51 +0000)
FossilOrigin-Name: e2c9d4c6b731ea9afbb9cb22f86a3db3670ca67968f15891dc46ae1fc9ba34dc

manifest
manifest.uuid
src/shell.c.in

index 14b45728561eb56bb2ff736d9a7823c451d01894..96d0083569ce4a2e4667e189ade34ee2b71770c7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\sthe\s3.53.0\srelease\schanges\sinto\sthe\scli-prompt\sbranch
-D 2026-04-09T13:21:09.840
+C Clean-ups\sin\sprompt\sgeneration\sin\sthe\sCLI.
+D 2026-04-09T18:51:09.198
 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 a81e410148dbe766675291436cd0e8d5eed3d201c84325c650214f7005957825
+F src/shell.c.in 1dcccee78238e27dfa90df67e15fb194c087f552608248fd900b7a5ee730782a
 F src/sqlite.h.in e2915e4a86d5e0783afb5cb72411df38d987c7f3c5aa2d5441b8e74d30b649d8
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 1b7a0ee438bb5c2896d0609c537e917d8057b3340f6ad004d2de44f03e3d3cca
@@ -2197,8 +2197,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 5c544f169680804c9652b8f9fc843a4bac052706be6bac205baf13a8c83fc840 4525003a53a7fc63ca75c59b22c79608659ca12f0131f52c18637f829977f20b
-R 23f77bc70e281ba78bda728ec5fa2cf0
+P 8fd48b9fe47d47b3eca31d187f1d98174c257daea220ae7be18e4c82764d9d5c
+R 7ffb65d89e42eb90bf23dccbc7a1df3f
 U drh
-Z 6d085a4adab77824df1df33b9c2cf0d2
+Z ee302bdc160a37743cf8ada2bf8fc7e4
 # Remove this line to create a well-formed Fossil manifest.
index 60a6fac2ae039471b4fa3de82dab4cac1386eaa5..8a875c645a61fb0ee327e5c2e3778b31a3210efc 100644 (file)
@@ -1 +1 @@
-8fd48b9fe47d47b3eca31d187f1d98174c257daea220ae7be18e4c82764d9d5c
+e2c9d4c6b731ea9afbb9cb22f86a3db3670ca67968f15891dc46ae1fc9ba34dc
index c1f1e648de75566b55d1330d634ced8a0f0ad7e2..1df77e475a22134c0ba4b63e9e85318d307ca09b 100644 (file)
@@ -828,16 +828,16 @@ static char *shell_strncpy(char *dest, const char *src, size_t n){
 typedef void *t_NoDynaPrompt;
 # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
 #else
-# define CONTINUATION_PROMPT dynamicContinuePrompt()
-# define CONTINUE_PROMPT_RESET \
+# define CONTINUATION_PROMPT(X) dynamicContinuePrompt()
+# define CONTINUE_PROMPT_RESET(X) \
   do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
-# define CONTINUE_PROMPT_AWAITS(p,s) \
+# define CONTINUE_PROMPT_AWAITS(X,p,s) \
   if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
-# define CONTINUE_PROMPT_AWAITC(p,c) \
+# define CONTINUE_PROMPT_AWAITC(X,p,c) \
   if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
-# define CONTINUE_PAREN_INCR(p,n) \
+# define CONTINUE_PAREN_INCR(X,p,n) \
   if(p && stdin_is_interactive) (trackParenLevel(p,n))
-# define CONTINUE_PROMPT_PSTATE (&dynPrompt)
+# define CONTINUE_PROMPT_PSTATE(X) (&dynPrompt)
 typedef struct DynaPrompt *t_DynaPromptRef;
 # define SCAN_TRACKER_REFTYPE t_DynaPromptRef
 
@@ -1048,7 +1048,7 @@ static char *one_input_line(ShellState *p, char *zPrior, int isContinuation){
   if( in!=0 ){
     zResult = local_getline(zPrior, in);
   }else{
-    zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
+    zPrompt = isContinuation ? CONTINUATION_PROMPT(p) : mainPrompt;
 #if SHELL_USE_LOCAL_GETLINE
     sputz(stdout, zPrompt);
     fflush(stdout);
@@ -12082,8 +12082,10 @@ meta_command_exit:
 # define CHAR_BIT 8
 #endif
 typedef enum {
-  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
-  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
+  QSS_HasDark = 1<<CHAR_BIT,
+  QSS_EndingSemi = 2<<CHAR_BIT,
+  QSS_CharMask = (1<<CHAR_BIT)-1,
+  QSS_ScanMask = 3<<CHAR_BIT,
   QSS_Start = 0
 } QuickScanState;
 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
@@ -12095,10 +12097,14 @@ typedef enum {
 /*
 ** Scan line for classification to guide shell's handling.
 ** The scan is resumable for subsequent lines when prior
-** return values are passed as the 2nd argument.
+** return values are passed as the 3rd argument (qss).
 */
-static QuickScanState quickscan(char *zLine, QuickScanState qss,
-                                SCAN_TRACKER_REFTYPE pst){
+static QuickScanState quickscan(
+  ShellState *p,
+  char *zLine,
+  QuickScanState qss,
+  SCAN_TRACKER_REFTYPE pst
+){
   char cin;
   char cWait = (char)qss; /* intentional narrowing loss */
   if( cWait==0 ){
@@ -12121,7 +12127,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss,
         if( *zLine=='*' ){
           ++zLine;
           cWait = '*';
-          CONTINUE_PROMPT_AWAITS(pst, "/*");
+          CONTINUE_PROMPT_AWAITS(p, pst, "/*");
           qss = QSS_SETV(qss, cWait);
           goto TermScan;
         }
@@ -12129,18 +12135,18 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss,
       case '[':
         cWait = ']';
         qss = QSS_HasDark | cWait;
-        CONTINUE_PROMPT_AWAITC(pst, cin);
+        CONTINUE_PROMPT_AWAITC(p, pst, cin);
         goto TermScan;
       case '`': case '\'': case '"':
         cWait = cin;
         qss = QSS_HasDark | cWait;
-        CONTINUE_PROMPT_AWAITC(pst, cin);
+        CONTINUE_PROMPT_AWAITC(p, pst, cin);
         goto TermScan;
       case '(':
-        CONTINUE_PAREN_INCR(pst, 1);
+        CONTINUE_PAREN_INCR(p, pst, 1);
         break;
       case ')':
-        CONTINUE_PAREN_INCR(pst, -1);
+        CONTINUE_PAREN_INCR(p, pst, -1);
         break;
       default:
         break;
@@ -12156,7 +12162,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss,
           if( *zLine != '/' )
             continue;
           ++zLine;
-          CONTINUE_PROMPT_AWAITC(pst, 0);
+          CONTINUE_PROMPT_AWAITC(p, pst, 0);
           qss = QSS_SETV(qss, 0);
           goto PlainScan;
         case '`': case '\'': case '"':
@@ -12167,7 +12173,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss,
           }
           deliberate_fall_through; /* FALLTHRU */
         case ']':
-          CONTINUE_PROMPT_AWAITC(pst, 0);
+          CONTINUE_PROMPT_AWAITC(p, pst, 0);
           qss = QSS_SETV(qss, 0);
           goto PlainScan;
         default: assert(0);
@@ -12183,7 +12189,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss,
 ** than a semi-colon.  The SQL Server style "go" command is understood
 ** as is the Oracle "/".
 */
-static int line_is_command_terminator(char *zLine){
+static int line_is_command_terminator(ShellState *p, char *zLine){
   while( IsSpace(zLine[0]) ){ zLine++; };
   if( zLine[0]=='/' )
     zLine += 1; /* Oracle */
@@ -12191,7 +12197,7 @@ static int line_is_command_terminator(char *zLine){
     zLine += 2; /* SQL Server */
   else
     return 0;
-  return quickscan(zLine, QSS_Start, 0)==QSS_Start;
+  return quickscan(p, zLine, QSS_Start, 0)==QSS_Start;
 }
 
 /*
@@ -12440,7 +12446,7 @@ static int process_input(ShellState *p, const char *zSrc){
   p->zInFile = zSrc;
   saved_lineno = p->lineno;
   p->lineno = 0;
-  CONTINUE_PROMPT_RESET;
+  CONTINUE_PROMPT_RESET(p);
   while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
     fflush(p->out);
     zLine = one_input_line(p, zLine, nSql>0);
@@ -12455,11 +12461,11 @@ static int process_input(ShellState *p, const char *zSrc){
     }
     p->lineno++;
     if( QSS_INPLAIN(qss)
-        && line_is_command_terminator(zLine)
+        && line_is_command_terminator(p, zLine)
         && line_is_complete(zSql, nSql) ){
       memcpy(zLine,";",2);
     }
-    qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
+    qss = quickscan(p, zLine, qss, CONTINUE_PROMPT_PSTATE(p));
     if( QSS_PLAINWHITE(qss) && nSql==0 ){
       /* Just swallow single-line whitespace */
       echo_group_input(p, zLine);
@@ -12467,7 +12473,7 @@ static int process_input(ShellState *p, const char *zSrc){
       continue;
     }
     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
-      CONTINUE_PROMPT_RESET;
+      CONTINUE_PROMPT_RESET(p);
       echo_group_input(p, zLine);
       if( zLine[0]=='.' ){
         rc = do_meta_command(zLine, p);
@@ -12511,7 +12517,7 @@ static int process_input(ShellState *p, const char *zSrc){
     }else if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
       echo_group_input(p, zSql);
       errCnt += runOneSqlLine(p, zSql, p->zInFile, startline);
-      CONTINUE_PROMPT_RESET;
+      CONTINUE_PROMPT_RESET(p);
       nSql = 0;
       if( p->nPopOutput ){
         output_reset(p);
@@ -12535,7 +12541,7 @@ static int process_input(ShellState *p, const char *zSrc){
     /* This may be incomplete. Let the SQL parser deal with that. */
     echo_group_input(p, zSql);
     errCnt += runOneSqlLine(p, zSql, p->zInFile, startline);
-    CONTINUE_PROMPT_RESET;
+    CONTINUE_PROMPT_RESET(p);
   }
   free(zSql);
   free(zLine);