-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
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
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.
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 */
/*
** 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.
*/
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") ){
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];
}
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
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
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);
}
/* 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
output_reset(&data);
data.doXdgOpen = 0;
clearTempFile(&data);
+ while( data.nModeStack ) modePop(&data);
+ free(data.aModeStack);
modeFree(&data.mode);
if( data.nSavedModes ){
int ii;