From: drh <> Date: Sat, 25 Apr 2026 15:05:46 +0000 (+0000) Subject: Simplify the modePush()/modePop() implementation in the CLI. X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=39b2fe7e5b26206f48244a39413b38b766b15232;p=thirdparty%2Fsqlite.git Simplify the modePush()/modePop() implementation in the CLI. FossilOrigin-Name: 92cad2cd7284d3a969b713336865007da2b0b2a8eef367d4185802174cbd027a --- diff --git a/manifest b/manifest index 08e3b0eb59..206f1f645e 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 99eea82d42..7e9bdffb98 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11cfbae735669776c967522294b1606af90b4bd5379e2e1ed722520887b57757 +92cad2cd7284d3a969b713336865007da2b0b2a8eef367d4185802174cbd027a diff --git a/src/shell.c.in b/src/shell.c.in index 13bd47dc01..6c08093a40 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -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; iimode.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;