]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplify the modePush()/modePop() implementation in the CLI.
authordrh <>
Sat, 25 Apr 2026 15:05:46 +0000 (15:05 +0000)
committerdrh <>
Sat, 25 Apr 2026 15:05:46 +0000 (15:05 +0000)
FossilOrigin-Name: 92cad2cd7284d3a969b713336865007da2b0b2a8eef367d4185802174cbd027a

manifest
manifest.uuid
src/shell.c.in

index 08e3b0eb59d77e4dbf8ad0f1b38604728d86146a..206f1f645e716811683b6003608254209ad3ac8e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\srun\sexpridx2.test\sas\spart\sof\sthe\s"journaltest"\spermutation,\sas\sit\srequires\swal\smode.
-D 2026-04-25T14:32:05.309
+C Simplify\sthe\smodePush()/modePop()\simplementation\sin\sthe\sCLI.
+D 2026-04-25T15:05:46.435
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -736,7 +736,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 928ff887f2a7c64275182060d94d06fdddbe32226c569781cf7e7edc6f58d7fd
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 4c05cde130f26991b7411d8c6809e0630625e18078742c963a047b4b9cc01d49
-F src/shell.c.in 680ca2fe2aed5e72fbe1dfbf0218b6588b4b49f25419e558387d3f1fefdff72c
+F src/shell.c.in 70879f02b889444ec68d9711d4cf62f47c02f95a9bdbfe08cf47a6493ebdc692
 F src/sqlite.h.in 39d2e09114d2bdb7afd998f4a469c8f8cd065f8093835a7d0422f260fc78fb4f
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 9788c301f95370fa30e808861f1d2e6f022a816ddbe2a4f67486784c1b31db2e
@@ -2203,8 +2203,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 60d7cd625a6160ba1bc60fd00fab2e91e0deff42034c6864107c19330b35ea7a
-R 9624c382989005331dc93683602c4ff2
-U dan
-Z 1e905b825342255a77f50bd2b13ac15d
+P 11cfbae735669776c967522294b1606af90b4bd5379e2e1ed722520887b57757
+R ce7f4db60dba8b68ab7b6539006ae917
+U drh
+Z 8bf3c788d3ebdc6dce6b0a5a48919414
 # Remove this line to create a well-formed Fossil manifest.
index 99eea82d42e4332bc1f08c5dce0b357463a7962a..7e9bdffb9887ed63ddcc920bb7d762f08dd7199a 100644 (file)
@@ -1 +1 @@
-11cfbae735669776c967522294b1606af90b4bd5379e2e1ed722520887b57757
+92cad2cd7284d3a969b713336865007da2b0b2a8eef367d4185802174cbd027a
index 13bd47dc017e40446fb5cd27b43533e2a8632d81..6c08093a400afa7fdbaf57ff28f3fd5a3afc3494 100644 (file)
@@ -401,7 +401,8 @@ struct ShellState {
   FILE *pLog;            /* Write log output here */
   char *azPrompt[2];     /* Main and continuation prompt strings */
   Mode mode;             /* Current display mode */
-  Mode modePrior;        /* Backup */
+  Mode *aModeStack;      /* Backups */
+  unsigned nModeStack;   /* Number of entries in aModeStack[] */
   struct SavedMode {     /* Ability to define custom mode configurations */
     char *zTag;            /* Name of this saved mode */
     Mode mode;              /* The saved mode */
@@ -2096,27 +2097,21 @@ static int modeFind(ShellState *p, const char *zName){
 /*
 ** Save or restore the current output mode
 */
-static void modeSave(ShellState *p, Mode *pSaveAt){
-  modeDup(pSaveAt, &p->mode);
-}
-static void modeRestore(ShellState *p, Mode *pSaveAt){
-  modeFree(&p->mode);
-  p->mode = *pSaveAt;
-  memset(pSaveAt, 0, sizeof(Mode));
-}
 static void modePush(ShellState *p){
-  if( p->nPopMode==0 ){
-    modeFree(&p->modePrior);
-    modeDup(&p->modePrior,&p->mode);
-  }
+  p->aModeStack = realloc(p->aModeStack, sizeof(Mode)*(1+p->nModeStack));
+  shell_check_oom(p->aModeStack);
+  modeDup(&p->aModeStack[p->nModeStack], &p->mode);
+  p->nModeStack++;
 }
 static void modePop(ShellState *p){
-  if( p->modePrior.spec.iVersion>0 ){
-    modeRestore(p, &p->modePrior);
+  if( p->nModeStack ){
+    modeFree(&p->mode);
+    p->nModeStack--;
+    memcpy(&p->mode, &p->aModeStack[p->nModeStack], sizeof(Mode));
+    memset(&p->aModeStack[p->nModeStack], 0, sizeof(Mode));
   }
 }
 
-
 /*
 ** A callback for the sqlite3_log() interface.
 */
@@ -8544,7 +8539,6 @@ static int dotCmdMode(ShellState *p){
       chng = 1;  /* Not really a change, but we still want to suppress the
                  ** "current mode" output */
     }else if( optionMatch(z,"once") ){
-      p->nPopMode = 0;
       modePush(p);
       p->nPopMode = 1;
     }else if( optionMatch(z,"noquote") ){
@@ -9750,7 +9744,6 @@ static int do_meta_command(const char *zLine, ShellState *p){
     const char *zSchema = 0;
     int ii;
     char *zSql;
-    Mode savedMode;
     open_db(p, 0);
     for(ii=1; ii<nArg; ii++){
       const char *z = azArg[ii];
@@ -9768,13 +9761,13 @@ static int do_meta_command(const char *zLine, ShellState *p){
     }
     zSql = sqlite3_mprintf("SELECT analyze(%Q)", zSchema);
     shell_check_oom(zSql);
-    modeSave(p, &savedMode);
+    modePush(p);
     modeChange(p, MODE_BATCH);
     p->mode.spec.nLineLimit = 0;
     p->mode.spec.nCharLimit = 0;
     p->mode.spec.nTitleLimit = 0;
     shell_exec(p, zSql, 0);
-    modeRestore(p, &savedMode);
+    modePop(p);
     sqlite3_free(zSql);
   }else
 
@@ -10390,11 +10383,10 @@ static int do_meta_command(const char *zLine, ShellState *p){
     if( debugFlag ){
       cli_printf(stdout,"%s;\n", sqlite3_str_value(pSql));
     }else{
-      Mode savedMode;
-      modeSave(p, &savedMode);
+      modePush(p);
       modeChange(p, MODE_Split);
       shell_exec(p, sqlite3_str_value(pSql), 0);
-      modeRestore(p, &savedMode);
+      modePop(p);
     }
     sqlite3_str_free(pSql);
   }else
@@ -11827,7 +11819,6 @@ static int do_meta_command(const char *zLine, ShellState *p){
     sqlite3_stmt *pStmt;
     sqlite3_str *pSql;
     const char *zPattern = nArg>1 ? azArg[1] : 0;
-    Mode savedMode;
 
     open_db(p, 0);
     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
@@ -11863,11 +11854,11 @@ static int do_meta_command(const char *zLine, ShellState *p){
     }
 
     /* Run the SQL statement in "split" mode. */
-    modeSave(p, &savedMode);
+    modePush(p);
     modeChange(p, MODE_Split);
     shell_exec(p, sqlite3_str_value(pSql), 0);
     sqlite3_str_free(pSql);
-    modeRestore(p, &savedMode);
+    modePop(p);
     if( rc ) return shellDatabaseError(p->db);
   }else
 
@@ -14052,6 +14043,8 @@ int SQLITE_CDECL main(int argc, char **argv){
   output_reset(&data);
   data.doXdgOpen = 0;
   clearTempFile(&data);
+  while( data.nModeStack ) modePop(&data);
+  free(data.aModeStack);
   modeFree(&data.mode);
   if( data.nSavedModes ){
     int ii;