#define MODE_Www 20 /* Full web-page output */
/*
+** Information about how each display-mode behaves.
*/
typedef struct ModeInfo ModeInfo;
struct ModeInfo {
unsigned char eRSep; /* Row separator */
unsigned char eNull; /* Null representation */
unsigned char eText; /* Default text encoding */
- unsigned char eBlob; /* Default blob encoding */
- unsigned char bHdr; /* Show headers? */
- unsigned char eTitle; /* Header incoding. */
+ unsigned char eHdr; /* Default header encoding. */
+ unsigned char eBlob; /* Default blob encoding. */
+ unsigned char bHdr; /* Show headers by default. 0: n/a, 1: no 2: yes */
unsigned char eStyle; /* Underlying QRF style */
unsigned char eCx; /* 0: other, 1: line, 2: columnar */
- unsigned char bTx; /* Column headers enabled by default */
};
static const char *aModeStr[] =
- /* 0 1 2 3 4 5 6 7 8 9 10 11 */
- { 0, "\n", "|", " ", ",", "\r\n", "\036", "\037", "\t", "", "NULL", "null" };
-static const ModeInfo aModeInfo[] = {
-/* zName eCSep eRSep eNull eText eBlob bHdr eTitle eStyle eCx bTx */
- { "ascii", 7, 6, 9, 1, 1, 1, 1, 12, 0, 0 },
- { "box", 0, 0, 9, 1, 1, 2, 1, 1, 2, 1 },
- { "c", 4, 1, 2, 5, 4, 1, 5, 12, 0, 0 },
- { "column", 0, 0, 9, 1, 1, 2, 1, 2, 2, 1 },
- { "count", 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 },
- { "csv", 4, 5, 9, 3, 1, 1, 3, 12, 0, 0 },
- { "html", 0, 0, 9, 4, 1, 2, 4, 7, 0, 0 },
- { "insert", 0, 0, 10, 2, 2, 1, 2, 8, 0, 0 },
- { "jatom", 4, 1, 11, 6, 5, 1, 6, 12, 0, 0 },
- { "jobject", 0, 1, 11, 6, 5, 0, 0, 10, 0, 0 },
- { "json", 0, 0, 11, 6, 6, 0, 0, 9, 0, 0 },
- { "line", 0, 1, 9, 1, 1, 0, 0, 11, 1, 0 },
- { "list", 2, 1, 9, 1, 1, 1, 1, 12, 0, 0 },
- { "markdown", 0, 0, 9, 1, 1, 2, 1, 13, 2, 1 },
- { "off", 0, 0, 0, 0, 0, 0, 0, 14, 0, 0 },
- { "qbox", 0, 0, 9, 2, 2, 2, 1, 1, 2, 1 },
- { "quote", 4, 1, 10, 2, 2, 1, 2, 12, 0, 0 },
- { "table", 0, 0, 9, 1, 1, 2, 1, 19, 2, 1 },
- { "tabs", 8, 1, 9, 3, 1, 1, 3, 12, 0, 0 },
- { "tcl", 3, 1, 9, 5, 4, 1, 5, 12, 0, 0 },
- { "www", 0, 0, 9, 4, 1, 2, 4, 7, 0, 1 },
-}; /* | / / \ \ | / /
- ** | / / \ \ | / /
- ** First three columns These five column use integers that
- ** are indexed into correspond to QRF codes. If QRF codes
- ** aModeStr[]. change, these columns must change to match.
- ** eText and eTitle are QRF_TEXT_....
- ** eBlob is QRF_BLOB_.... bHdr is QRF_SW_....
- ** eStyle is QRF_STYLE_.... */
+ /* 0 1 2 3 4 5 6 7 8 */
+ { 0, "\n", "|", " ", ",", "\r\n", "\036", "\037", "\t",
+ "", "NULL", "null", "\"\"" };
+ /* 9 10 11 12 */
+static const ModeInfo aModeInfo[] = {
+/* zName eCSep eRSep eNull eText eHdr eBlob bHdr eStyle eCx */
+ { "ascii", 7, 6, 9, 1, 1, 1, 1, 12, 0 },
+ { "box", 0, 0, 9, 1, 1, 1, 2, 1, 2 },
+ { "c", 4, 1, 10, 5, 5, 4, 1, 12, 0 },
+ { "column", 0, 0, 9, 1, 1, 1, 2, 2, 2 },
+ { "count", 0, 0, 0, 0, 0, 0, 0, 3, 0 },
+ { "csv", 4, 5, 9, 3, 3, 1, 1, 12, 0 },
+ { "html", 0, 0, 9, 4, 4, 1, 2, 7, 0 },
+ { "insert", 0, 0, 10, 2, 2, 2, 1, 8, 0 },
+ { "jatom", 4, 1, 11, 6, 6, 5, 1, 12, 0 },
+ { "jobject", 0, 1, 11, 6, 6, 5, 0, 10, 0 },
+ { "json", 0, 0, 11, 6, 6, 0, 0, 9, 0 },
+ { "line", 0, 1, 9, 1, 1, 0, 0, 11, 1 },
+ { "list", 2, 1, 9, 1, 1, 1, 1, 12, 0 },
+ { "markdown", 0, 0, 9, 1, 1, 1, 2, 13, 2 },
+ { "off", 0, 0, 0, 0, 0, 0, 0, 14, 0 },
+ { "qbox", 0, 0, 9, 2, 1, 2, 2, 1, 2 },
+ { "quote", 4, 1, 10, 2, 2, 2, 1, 12, 0 },
+ { "table", 0, 0, 9, 1, 1, 1, 2, 19, 2 },
+ { "tabs", 8, 1, 9, 3, 3, 1, 1, 12, 0 },
+ { "tcl", 3, 1, 12, 5, 5, 4, 1, 12, 0 },
+ { "www", 0, 0, 9, 4, 4, 1, 2, 7, 0 }
+}; /* | / / | / / | | \
+ ** | / / | / / | | \_ 2: columnar
+ ** Index into aModeStr[] | / / | | 1: line
+ ** | / / | | 0: other
+ ** | / / | \
+ ** text encoding |/ | show | \
+ ** v-------------------' | hdrs? | The QRF style
+ ** 0: n/a blob | v-----'
+ ** 1: plain v_---------' 0: n/a
+ ** 2: sql 0: n/a 1: no
+ ** 3: csv 1: as-text 2: yes
+ ** 4: html 2: sql
+ ** 5: c 3: hex
+ ** 6: json 4: c
+ ** 5: json
+ ******************************************************************/
/*
** These are the column/row/line separators used by the various
** import/export modes.
p->spec.eText = pI->eText;
p->spec.eBlob = pI->eBlob;
p->spec.bTitles = pI->bHdr;
- p->spec.eTitle = pI->eTitle;
+ p->spec.eTitle = pI->eHdr;
}
/*
return -1;
}
+/*
+** This function computes what to show the user about the configured
+** titles (or column-names). Output is an integer between 0 and 3:
+**
+** 0: The titles do not matter. Never show anything.
+** 1: Show "--titles off"
+** 2: Show "--titles on"
+** 3: Show "--title VALUE" where VALUE is an encoding method
+** to use, one of: plain sql csv html tcl json
+**
+** Inputs are:
+**
+** spec.bTitles (bT) Whether or not to show the titles
+** spec.eTitle (eT) The actual encoding to be used for titles
+** ModeInfo.bHdr (bH) Default value for spec.bTitles
+** ModeInfo.eHdr (eH) Default value for spec.eTitle
+** bAll Whether the -v option is used
+*/
+static int modeTitleDsply(ShellState *p, int bAll){
+ int eMode = p->mode.eMode;
+ const ModeInfo *pI = &aModeInfo[eMode];
+ int bT = p->mode.spec.bTitles;
+ int eT = p->mode.spec.eTitle;
+ int bH = pI->bHdr;
+ int eH = pI->eHdr;
+
+ /* Variable "v" is the truth table that will determine the answer
+ **
+ ** Actual encoding is different from default
+ ** vvvvvvvv */
+ sqlite3_uint64 v = 0x0133013311220102;
+ /* ^^^^ ^^^^
+ ** Upper 2-byte groups for when ON/OFF disagrees with
+ ** the default. */
+
+ if( bH==0 ) return 0; /* Header not appliable. Ex: off, count */
+
+ if( eT==0 ) eT = eH; /* Fill in missing spec.eTitle */
+ if( bT==0 ) bT = bH; /* Fill in missing spec.bTitles */
+
+ if( eT!=eH ) v >>= 32; /* Encoding disagree in upper 4-bytes */
+ if( bT!=bH ) v >>= 16; /* ON/OFF disagree in upper 2-byte pairs */
+ if( bT<2 ) v >>= 8; /* ON in even bytes, OFF in odd bytes (1st byte 0) */
+ if( !bAll ) v >>= 4; /* bAll values are in the lower half-byte */
+
+ return v & 3; /* Return the selected truth-table entry */
+}
+
/*
** DOT-COMMAND: .mode
**
return 1;
}
k = pickStr(azArg[++i],&zErr,
- "off","on","plain","sql","html","tcl","json","");
- /* 0 1 2 3 4 5 6 */
+ "off","on","plain","sql","csv","html","tcl","json","");
+ /* 0 1 2 3 4 5 6 7 */
if( k<0 ){
dotCmdError(p, i, "bad --titles value","%z", zErr);
return 1;
}
p->mode.spec.bTitles = k>=1 ? QRF_Yes : QRF_No;
- p->mode.spec.eTitle = k>1 ? k-1 : aModeInfo[p->mode.eMode].eTitle;
+ p->mode.spec.eTitle = k>1 ? k-1 : aModeInfo[p->mode.eMode].eHdr;
chng = 1;
}else if( optionMatch(z,"widths") ){
int nWidth = 0;
sqlite3_str *pDesc = sqlite3_str_new(p->db);
char *zDesc;
const char *zSetting;
- int bSameTitle;
- int bTitleOn;
+
sqlite3_str_appendall(pDesc,pI->zName);
if( bAll || (p->mode.spec.nAlign && pI->eCx==2) ){
int i;
sqlite3_str_appendf(pDesc," --textjsonb %s",
p->mode.spec.bTextJsonb==QRF_Yes ? "on" : "off");
}
- bSameTitle = p->mode.spec.eTitle==pI->eTitle;
- bTitleOn = (p->mode.spec.bTitles==QRF_Yes);
- if( bAll || bTitleOn!=pI->bTx || (bTitleOn && !bSameTitle) ){
+ k = modeTitleDsply(p, bAll);
+ if( k==1 ){
+ sqlite3_str_appendall(pDesc, " --titles off");
+ }else if( k==2 ){
+ sqlite3_str_appendall(pDesc, " --titles on");
+ }else if( k==3 ){
static const char *azTitle[] =
- { "off", "on", "plain", "sql", "csv", "html", "tcl", "json"};
- if( !bTitleOn ){
- k = 0;
- }else if( bSameTitle ){
- k = 1;
- }else{
- k = p->mode.spec.eTitle+1;
- }
- sqlite3_str_appendf(pDesc," --titles %s", azTitle[k]);
- }
+ { "plain", "sql", "csv", "html", "tcl", "json"};
+ sqlite3_str_appendf(pDesc, " --titles %s",
+ azTitle[p->mode.spec.eTitle-1]);
+ }
if( p->mode.spec.nWidth>0 && (bAll || pI->eCx==2) ){
int i;
const char *zSep = " --widths ";
if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
if( nArg==2 ){
p->mode.spec.bTitles = booleanValue(azArg[1]) ? QRF_Yes : QRF_No;
- p->mode.spec.eTitle = aModeInfo[p->mode.eMode].eTitle;
+ p->mode.spec.eTitle = aModeInfo[p->mode.eMode].eHdr;
}else{
eputz("Usage: .headers on|off\n");
rc = 1;