]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the %z format to the sqlite_mprintf() and related functions. (CVS 1028)
authordrh <drh@noemail.net>
Mon, 16 Jun 2003 03:08:18 +0000 (03:08 +0000)
committerdrh <drh@noemail.net>
Mon, 16 Jun 2003 03:08:18 +0000 (03:08 +0000)
FossilOrigin-Name: eca1398eaac67d772aff2676a470d9a6d96a93ca

manifest
manifest.uuid
src/printf.c
src/test1.c
test/printf.test

index ea68d4207361c6ddf5377ba7f15a4e594a4f114c..db853d078880951b4d5f7df5baf1e8140cf5d187 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\sflatten\sa\ssubquery\swhich\sis\sthe\sright\sterm\sof\sa\sLEFT\sOUTER\sJOIN\nif\sthe\ssubquery\scontains\sa\sWHERE\sclause.\s\sTicket\s#350.\s(CVS\s1027)
-D 2003-06-16T00:40:35
+C Add\sthe\s%z\sformat\sto\sthe\ssqlite_mprintf()\sand\srelated\sfunctions.\s(CVS\s1028)
+D 2003-06-16T03:08:19
 F Makefile.in 9ad23ed4ca97f9670c4496432e3fbd4b3760ebde
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -41,7 +41,7 @@ F src/pager.c 6c50e8dc861bb08f8c52b1fe9aabef6554d61c95
 F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31
 F src/parse.y 917250e5d86bdee752355e6617ea2e8ee12438bf
 F src/pragma.c 3b4f5a800e7a2145bc1930f323232e297d4eb782
-F src/printf.c 12ab57e638c8201033c96717df7af59e06933314
+F src/printf.c 12e45d482ac8abcc6f786fc99e5bed7dd9a51af0
 F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
 F src/select.c 29c53228a4e66bfcebd797b7539678fcd0e2cf64
 F src/shell.c 3ed268908fd69c8fd4b28dbe415075cbf0e3991a
@@ -50,7 +50,7 @@ F src/sqlite.h.in 54619fa5df4c83b22def66bb3d24808fd03dcbae
 F src/sqliteInt.h d1d883d9116dadf63ffe1bafe17ba6455b7db59e
 F src/table.c 4301926464d88d2c2c7cd21c3360aa75bf068b95
 F src/tclsqlite.c d6860dcd56348b9521726280b72c412d2a33ae97
-F src/test1.c 4596acd9d9f2a49fda0160a8a6dee5bfc7c6c325
+F src/test1.c b9cfee0bd97d0ade63a3ce76e910b444fb32dce2
 F src/test2.c 5014337d8576b731cce5b5a14bec4f0daf432700
 F src/test3.c 30985ebdfaf3ee1462a9b0652d3efbdc8d9798f5
 F src/threadtest.c d641a5219e718e18a1a80a50eb9bb549f451f42e
@@ -101,7 +101,7 @@ F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
 F test/null.test 5c2b57307e4b6178aae825eb65ddbee01e76b0fd
 F test/pager.test dd31da9bee94a82e2e87e58cf286cfe809f8fc5f
 F test/pragma.test 4c707a6f7d3cbf72d46ed9d9eb0e1ea6e42dc3e4
-F test/printf.test a29b8afa24edb4411adfe473b12ac32c84098fce
+F test/printf.test 3ed02f1361402c0767492cd5cef4650e61df8308
 F test/quick.test c527bdb899b12a8cd8ceecce45f72922099f4095
 F test/quote.test 08f23385c685d3dc7914ec760d492cacea7f6e3d
 F test/rowid.test e4d6d619d8699a1fa5a48f3f78db39985bd47ebb
@@ -165,7 +165,7 @@ F www/speed.tcl 296cc5632d069b56d3ef5409ca0df90f486c10fb
 F www/sqlite.tcl 4bd1729e320f5fa9125f0022b281fbe839192125
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 14fdcc7fe8a60a6ba8584903636db8dc37eef26a
-P bcf5eeecdfd9897bc7c257119d7515fd34d222c1
-R ffe0cc5608b1ae6c3500625d1dc9cf93
+P dd8943e8583cf7ed3b662570a5607856fd246dac
+R 284605941d0d05dd0b8d73646e11aab9
 U drh
-Z d81db5180d17921ff4a8ae510148f465
+Z 92bf3faa2c4ab75022c55b293d1689d3
index 17938aa296bc486f920dfc97bd6ed9586db548ed..7c91dbc70d36dfb07c79b45afbbda7de0e646d3f 100644 (file)
@@ -1 +1 @@
-dd8943e8583cf7ed3b662570a5607856fd246dac
\ No newline at end of file
+eca1398eaac67d772aff2676a470d9a6d96a93ca
\ No newline at end of file
index 67144b26d04620f1d78043f93c07fbb6e8499142..69fbed76df3fadd30c21187f5f3e27d630123108 100644 (file)
@@ -66,6 +66,7 @@ enum et_type {    /* The type of the format field */
    etGENERIC,          /* Floating or exponential, depending on exponent. %g */
    etSIZE,             /* Return number of characters processed so far. %n */
    etSTRING,           /* Strings. %s */
+   etDYNSTRING,        /* Dynamically allocated strings. %z */
    etPERCENT,          /* Percent symbol. %% */
    etCHARX,            /* Characters. %c */
    etERROR,            /* Used to indicate no such conversion type */
@@ -97,6 +98,7 @@ typedef struct et_info {   /* Information about each format field */
 static et_info fmtinfo[] = {
   { 'd',  10,  "0123456789",       1,    0, etRADIX,      },
   { 's',   0,  0,                  0,    0, etSTRING,     }, 
+  { 'z',   0,  0,                  0,    0, etDYNSTRING,  }, 
   { 'q',   0,  0,                  0,    0, etSQLESCAPE,  },
   { 'Q',   0,  0,                  0,    0, etSQLESCAPE2, },
   { 'c',   0,  0,                  0,    0, etCHARX,      },
@@ -549,8 +551,13 @@ static int vxprintf(
         bufpt = buf;
         break;
       case etSTRING:
+      case etDYNSTRING:
         bufpt = va_arg(ap,char*);
-        if( bufpt==0 ) bufpt = "(null)";
+        if( bufpt==0 ){
+          bufpt = "";
+        }else if( xtype==etDYNSTRING ){
+          zExtra = bufpt;
+        }
         length = strlen(bufpt);
         if( precision>=0 && precision<length ) length = precision;
         break;
@@ -632,7 +639,11 @@ static int vxprintf(
       }
     }
     if( zExtra ){
-      sqliteFree(zExtra);
+      if( xtype==etDYNSTRING ){
+        free(zExtra);
+      }else{
+        sqliteFree(zExtra);
+      }
     }
   }/* End for loop over the format string */
   return errorflag ? -1 : count;
index 38c98d19b38929cc59d87c8efb7c2902f2ad28cd..d477581d102d523f6452007a1fbdda32a946dc24 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test1.c,v 1.24 2003/04/26 13:19:39 drh Exp $
+** $Id: test1.c,v 1.25 2003/06/16 03:08:19 drh Exp $
 */
 #include "sqliteInt.h"
 #include "tcl.h"
@@ -161,6 +161,30 @@ static int test_exec_printf(
   return TCL_OK;
 }
 
+/*
+** Usage:  sqlite_mprintf_z_test  SEPARATOR  ARG0  ARG1 ...
+**
+** Test the %z format of mprintf().  Use multiple mprintf() calls to 
+** concatenate arg0 through argn using separator as the separator.
+** Return the result.
+*/
+static int test_mprintf_z(
+  void *NotUsed,
+  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
+  int argc,              /* Number of arguments */
+  char **argv            /* Text of each argument */
+){
+  char *zResult = 0;
+  int i;
+
+  for(i=2; i<argc; i++){
+    zResult = sqlite_mprintf("%z%s%s", zResult, argv[1], argv[i]);
+  }
+  Tcl_AppendResult(interp, zResult, 0);
+  sqlite_freemem(zResult);
+  return TCL_OK;
+}
+
 /*
 ** Usage:  sqlite_get_table_printf  DB  FORMAT  STRING
 **
@@ -779,6 +803,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
      { "sqlite_mprintf_int",             (Tcl_CmdProc*)sqlite_mprintf_int    },
      { "sqlite_mprintf_str",             (Tcl_CmdProc*)sqlite_mprintf_str    },
      { "sqlite_mprintf_double",          (Tcl_CmdProc*)sqlite_mprintf_double },
+     { "sqlite_mprintf_z_test",          (Tcl_CmdProc*)test_mprintf_z        },
      { "sqlite_open",                    (Tcl_CmdProc*)sqlite_test_open      },
      { "sqlite_last_insert_rowid",       (Tcl_CmdProc*)test_last_rowid       },
      { "sqlite_exec_printf",             (Tcl_CmdProc*)test_exec_printf      },
index c6a62c59ff7578ddd0bbe83c23bafabb75be5ac3..b3e9698fa7b62b1145428e753a0510f58b00439c 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the sqlite_*_printf() interface.
 #
-# $Id: printf.test,v 1.5 2002/06/16 04:56:37 chw Exp $
+# $Id: printf.test,v 1.6 2003/06/16 03:08:19 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -111,4 +111,8 @@ do_test printf-5.3 {
   sqlite_mprintf_str {%% %d %d (%=10s)} 5 6 Hello
 } {% 5 6 (  Hello   )}
 
+do_test printf-6.1 {
+  sqlite_mprintf_z_test , one two three four five six
+} {,one,two,three,four,five,six}
+
 finish_test