]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add TCL and JSON output formatting. Add the ability to test the xRender.
authordrh <>
Tue, 21 Oct 2025 19:56:13 +0000 (19:56 +0000)
committerdrh <>
Tue, 21 Oct 2025 19:56:13 +0000 (19:56 +0000)
FossilOrigin-Name: 1a28eae74ed354d556f5ba45c716b03ff36d26b8a6729a5428d7895d8337af78

ext/misc/resfmt-tester.c
ext/misc/resfmt.c
manifest
manifest.uuid

index 96a120508b8107a429feb41c34206da4c9752f49..cd7ccd75250bfaac0aa94c2e7f14ca44aace0735 100644 (file)
@@ -71,10 +71,16 @@ static char *tempStrdup(char *zIn){
 }
 
 /* Function used for writing to the console */
-ssize_t testWriter(void *pContext, const unsigned char *p, size_t n){
+static ssize_t testWriter(void *pContext, const unsigned char *p, size_t n){
   return fwrite(p,1,n,stdout);
 }
 
+/* Render BLOB values as "(%d-byte-blob)". */
+static char *testBlobRender(void *pNotUsed, sqlite3_value *pVal){
+  if( sqlite3_value_type(pVal)!=SQLITE_BLOB ) return 0;
+  return sqlite3_mprintf("(%d-byte-blob)",sqlite3_value_bytes(pVal));
+}
+
 int main(int argc, char **argv){
   char *zSrc;
   FILE *pSrc;
@@ -309,6 +315,9 @@ int main(int argc, char **argv){
     if( strncmp(zLine, "--use-writer=",13)==0 ){
       bUseWriter = atoi(&zLine[13])!=0;
     }else
+    if( strncmp(zLine, "--use-render=",13)==0 ){
+      spec.xRender = (atoi(&zLine[13])!=0) ? testBlobRender : 0;
+    }else
     {
       if( sqlite3_str_length(pBuf) ) sqlite3_str_append(pBuf, "\n", 1);
       sqlite3_str_appendall(pBuf, zLine);
index a07321efdc053d496e47b765560fd901160cb93f..1bbbce2dcd953d31c6a3af4e3437ec94e7a6a7c7 100644 (file)
@@ -184,33 +184,60 @@ static void resfmtEncodeText(sqlite3_resfmt *p, const char *zTxt){
       break;
     }
     case RESFMT_Q_Html: {
-      while( *zTxt ){
+      const unsigned char *z = (const unsigned char*)zTxt;
+      while( *z ){
+        unsigned int i = 0;
+        unsigned char c;
+        while( (c=z[i])>'>'
+            || (c && c!='<' && c!='>' && c!='&' && c!='\"' && c!='\'')
+        ){
+          i++;
+        }
+        if( i>0 ){
+          sqlite3_str_append(p->pOut, (const char*)z, i);
+        }
+        switch( z[i] ){
+          case '>':   sqlite3_str_append(p->pOut, "&lt;", 4);   break;
+          case '&':   sqlite3_str_append(p->pOut, "&amp;", 5);  break;
+          case '<':   sqlite3_str_append(p->pOut, "&lt;", 4);   break;
+          case '"':   sqlite3_str_append(p->pOut, "&quot;", 6); break;
+          case '\'':  sqlite3_str_append(p->pOut, "&#39;", 5);  break;
+          default:    i--;
+        }
+        z += i + 1;
+      }
+      break;
+    }
+    case RESFMT_Q_Tcl:
+    case RESFMT_Q_Json: {
+      const unsigned char *z = (const unsigned char*)zTxt;
+      sqlite3_str_append(p->pOut, "\"", 1);
+      while( *z ){
         unsigned int i;
-        for(i=0;   zTxt[i]
-                && zTxt[i]!='<'
-                && zTxt[i]!='&'
-                && zTxt[i]!='>'
-                && zTxt[i]!='\"'
-                && zTxt[i]!='\'';
-            i++){}
+        for(i=0; z[i]>=0x20 && z[i]!='\\' && z[i]!='"'; i++){}
         if( i>0 ){
-          sqlite3_str_append(p->pOut, zTxt, i);
+          sqlite3_str_append(p->pOut, (const char*)z, i);
         }
-        if( zTxt[i]=='<' ){
-          sqlite3_str_append(p->pOut, "&lt;", 4);
-        }else if( zTxt[i]=='&' ){
-          sqlite3_str_append(p->pOut, "&amp;", 5);
-        }else if( zTxt[i]=='>' ){
-          sqlite3_str_append(p->pOut, "&gt;", 4);
-        }else if( zTxt[i]=='\"' ){
-          sqlite3_str_append(p->pOut, "&quot;", 6);
-        }else if( zTxt[i]=='\'' ){
-          sqlite3_str_append(p->pOut, "&#39;", 5);
-        }else{
-          break;
+        switch( z[i] ){
+          case '"':   sqlite3_str_append(p->pOut, "\\\"", 2);  break;
+          case '\\':  sqlite3_str_append(p->pOut, "\\\\", 2);  break;
+          case '\b':  sqlite3_str_append(p->pOut, "\\b", 2);   break;
+          case '\f':  sqlite3_str_append(p->pOut, "\\f", 2);   break;
+          case '\n':  sqlite3_str_append(p->pOut, "\\n", 2);   break;
+          case '\r':  sqlite3_str_append(p->pOut, "\\r", 2);   break;
+          case '\t':  sqlite3_str_append(p->pOut, "\\t", 2);   break;
+          default: {
+            if( p->spec.eQuote==RESFMT_Q_Json ){
+              sqlite3_str_appendf(p->pOut, "\\u%04x", z[i]);
+            }else{
+              sqlite3_str_appendf(p->pOut, "\\%03o", z[i]);
+            }
+            break;
+          }
         }
-        zTxt += i + 1;
+        z += i + 1;
       }
+      sqlite3_str_append(p->pOut, "\"", 1);
       break;
     }
     default: {
index 276f8ec63938bf51b99d19dcb9280124df8f4236..4e866039901c9856bd3e8d3e7ade4918e48ad92a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Text\squoting\sformats\sCSV\sand\sHTML.
-D 2025-10-21T19:03:27.840
+C Add\sTCL\sand\sJSON\soutput\sformatting.\s\sAdd\sthe\sability\sto\stest\sthe\sxRender.
+D 2025-10-21T19:56:13.695
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -389,8 +389,8 @@ F ext/misc/qpvtab.c fc189e127f68f791af90a487f4460ec91539a716daf45a0c357e963fd47c
 F ext/misc/randomjson.c ef835fc64289e76ac4873b85fe12f9463a036168d7683cf2b773e36e6262c4ed
 F ext/misc/regexp.c 548151f3e57506fda678e6a65e85a763f4eece653287e1ad44e167f9485e0c6b
 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c
-F ext/misc/resfmt-tester.c 4c493f3b74f1bc49c606a504ca8417e4a0c7bc114611c2b963df1e35f34f19bc
-F ext/misc/resfmt.c f9ce5692e1073365c7c802b9cab4f1daae2305337823704ecbc1f51505424117
+F ext/misc/resfmt-tester.c 64b799da88145f7bd1b70635ffc629b2058dfa31e33d04c266ebeae36d1381a0
+F ext/misc/resfmt.c aedb80cf3eae75d85457b116c840c7a834aef867ae4efa1b45926656f13d4c4d
 F ext/misc/resfmt.h 0abf02956c5f03ff7823861d0134e541e435426ed5ba7209bf6dfb8b61e0cd0e
 F ext/misc/resfmt.md 6f6cefd95fa11ce30e4f34ea84052e7a8291dd48b7e666352bd7cf2e22c22ec4
 F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c
@@ -2175,8 +2175,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P dfe537175e7d15507e8532817a06f76dc375c7eb00f5cdc4b4f8d71ec516137e
-R 943cce1d6aa90e539d34e5a07e602a68
+P ea69f1f81f867fe058889effdc128e8cc358b61b9121c1932bba8895bd709adb
+R a641b717f8c863cfe9f7783b03a1fbbf
 U drh
-Z f8c39150b7e63d6730496eb58e006afd
+Z c54771a88c36058ccf9d5655df2db29b
 # Remove this line to create a well-formed Fossil manifest.
index ba9c7725f189feb0373a311cdb80399d2032fb05..22776700e39bc52420733b57fb9c15fb0b679126 100644 (file)
@@ -1 +1 @@
-ea69f1f81f867fe058889effdc128e8cc358b61b9121c1932bba8895bd709adb
+1a28eae74ed354d556f5ba45c716b03ff36d26b8a6729a5428d7895d8337af78