r8355: - added a vsprintf() function
authorAndrew Tridgell <tridge@samba.org>
Tue, 12 Jul 2005 06:57:25 +0000 (06:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:20:10 +0000 (13:20 -0500)
- removed the --outputdir option from provision, as its not used any
  more (as ejs knows the real paths)

source/scripting/ejs/smbcalls_string.c
source/scripting/libjs/base.js
source/setup/provision
testprogs/ejs/bugs.js
testprogs/ejs/sprintf.js

index 7a19ecdf2cabaae78dd9771a443277f1884bfd46..ad998701f6d7f9553a3946a1256670aa5f9fdad6 100644 (file)
@@ -271,6 +271,41 @@ failed:
        return -1;
 }
 
+/*
+  used to build your own print function
+     str = vsprintf(args);
+*/
+static int ejs_vsprintf(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+       struct MprVar **args, *len, *v;
+       int i, ret, length;
+       if (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {
+               ejsSetErrorMsg(eid, "vsprintf invalid arguments");
+               return -1;
+       }
+       v = argv[0];
+       len = mprGetProperty(v, "length", NULL);
+       if (len == NULL) {
+               ejsSetErrorMsg(eid, "vsprintf takes an array");
+               return -1;
+       }
+       length = mprToInt(len);
+       args = talloc_array(mprMemCtx(), struct MprVar *, length);
+       if (args == NULL) {
+               return -1;
+       }
+
+       for (i=0;i<length;i++) {
+               char idx[16];
+               mprItoa(i, idx, sizeof(idx));
+               args[i] = mprGetProperty(v, idx, NULL);
+       }
+       
+       ret = ejs_sprintf(eid, length, args);
+       talloc_free(args);
+       return ret;
+}
+
 /*
   setup C functions that be called from ejs
 */
@@ -281,4 +316,5 @@ void smb_setup_ejs_string(void)
        ejsDefineStringCFunction(-1, "split", ejs_split, NULL, MPR_VAR_SCRIPT_HANDLE);
        ejsDefineCFunction(-1, "join", ejs_join, NULL, MPR_VAR_SCRIPT_HANDLE);
        ejsDefineCFunction(-1, "sprintf", ejs_sprintf, NULL, MPR_VAR_SCRIPT_HANDLE);
+       ejsDefineCFunction(-1, "vsprintf", ejs_vsprintf, NULL, MPR_VAR_SCRIPT_HANDLE);
 }
index c6b05755c4e734902e8ad09c41ac9a5a7717ddeb..181b3ca95900715111aaf20352933b3c890a0e87 100644 (file)
@@ -9,6 +9,14 @@ if (global["HAVE_BASE_JS"] != undefined) {
 }
 HAVE_BASE_JS=1
 
+/*
+  an essential function!
+*/
+function printf()
+{
+       print(vsprintf(arguments));
+}
+
 /*
   helper function to setup a rpc io object, ready for input
 */
index c388a10bf92e7bade8a9ae63541d8f6cb610de33..f37907241e1f19d71acb7ca5ff32458047ec6dbd 100755 (executable)
@@ -26,7 +26,6 @@ ok = GetOptions(ARGV, options,
                'nogroup=s',
                'wheel=s',
                'users=s',
-               'outputdir=s',
                'quiet');
 if (ok == false) {
    println("Failed to parse options: " + options.ERROR);
@@ -200,7 +199,6 @@ provision.pl [options]
  --host-ip     IPADDRESS       set ipaddress
  --host-guid   GUID            set hostguid (otherwise random)
  --invocationid        GUID            set invocationid (otherwise random)
- --outputdir   OUTPUTDIR       set output directory
  --adminpass   PASSWORD        choose admin password (otherwise random)
  --krbtgtpass  PASSWORD        choose krbtgt password (otherwise random)
  --machinepass PASSWORD        choose machine password (otherwise random)
index 01174f9eafebca9229b90916b04046949add2d3c..3c8a4daab341156a95cb439318472f8d19b74a82 100644 (file)
@@ -8,6 +8,7 @@
 /****************************************
 demo a bug in constructing arrays
 fix at http://build.samba.org/build.pl?function=diff;tree=samba4;revision=7124
+status: FIXED
 *****************************************/
 function arraybug() {
         var a;
@@ -38,6 +39,7 @@ function arraybug() {
 /****************************************
 demo a bug in variable arguments
 fix at http://build.samba.org/build.pl?function=diff;tree=samba4;revision=7085
+status: FIXED
 *****************************************/
 function argsbug() {
         println("we should have been called with 3 arguments");
@@ -51,6 +53,7 @@ function argsbug() {
 /****************************************
 demo a bug in constructing objects
 no fix available yet
+status: SUBMITTED
 *****************************************/
 function MyObj() {
         var o = new Object();
@@ -68,10 +71,23 @@ function objbug() {
         assert(o2.test == 42);
 }
 
+/*
+ demo a expression handling bug
+ status: SUBMITTED
+*/
+function exprbug() {
+       var a = new Array(10);
+       var i;
+       for (i=0;i<4;i++) {
+               a[1+(i*2)] = i;
+               a[2+(i*2)] = i*2;
+       }
+}
 
 /****************************************
 demo lack of recursion
 fix in http://build.samba.org/build.pl?function=diff;tree=samba4;revision=7127
+status: FIXED
 *****************************************/
 function fibonacci(n) {
        if (n < 3) {
@@ -87,9 +103,25 @@ function recursebug() {
         }
 }
 
+/****************************************
+demo lack of function variables inside functions
+status: FIXED IN SAMBA
+*****************************************/
+function callback()
+{
+       return "testing";
+}
+
+function fnbug(c)
+{
+       s = c();
+       assert(s == "testing");
+}
 
 /* run the tests */
 arraybug();
 argsbug("one", "two", "three");
 recursebug();
-objbug()
+exprbug();
+fnbug(callback);
+objbug();
index 34df4f9a42e8d97fe9efcb707154c4a630f4b0be..4d3d9a7555499d7abfb74eea00b4ccc8279dd74d 100755 (executable)
@@ -11,6 +11,11 @@ function check_result(s, v)
        assert(s == v);
 }
 
+function xprintf()
+{
+       return "XX{" + vsprintf(arguments) + "}XX";
+}
+
 check_result(sprintf("%d", 7), "7");
 check_result(sprintf("%04d", 42), "0042");
 check_result(sprintf("my string=%7.2s", "foo%7"), "my string=     fo");
@@ -19,4 +24,6 @@ check_result(sprintf("blah=0x%0*x", 4, 19), "blah=0x0013");
 check_result(sprintf("blah=%.0f", 1032), "blah=1032");
 check_result(sprintf("%4.2f%%", 72.32), "72.32%");
 
+check_result(xprintf("%4.2f%% and %s", 72.32, "foo"),"XX{72.32% and foo}XX");
+
 println("ALL OK");