-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
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
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.
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
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);
# 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))
/*
** 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 ){
if( *zLine=='*' ){
++zLine;
cWait = '*';
- CONTINUE_PROMPT_AWAITS(pst, "/*");
+ CONTINUE_PROMPT_AWAITS(p, pst, "/*");
qss = QSS_SETV(qss, cWait);
goto TermScan;
}
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;
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 '"':
}
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);
** 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 */
zLine += 2; /* SQL Server */
else
return 0;
- return quickscan(zLine, QSS_Start, 0)==QSS_Start;
+ return quickscan(p, zLine, QSS_Start, 0)==QSS_Start;
}
/*
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);
}
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);
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);
}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);
/* 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);