diff options
-rw-r--r-- | source4/scripting/ejs/smbcalls_string.c | 36 | ||||
-rw-r--r-- | source4/scripting/libjs/base.js | 8 | ||||
-rwxr-xr-x | source4/setup/provision | 2 | ||||
-rw-r--r-- | testprogs/ejs/bugs.js | 34 | ||||
-rwxr-xr-x | testprogs/ejs/sprintf.js | 7 |
5 files changed, 84 insertions, 3 deletions
diff --git a/source4/scripting/ejs/smbcalls_string.c b/source4/scripting/ejs/smbcalls_string.c index 7a19ecdf2c..ad998701f6 100644 --- a/source4/scripting/ejs/smbcalls_string.c +++ b/source4/scripting/ejs/smbcalls_string.c @@ -272,6 +272,41 @@ failed: } /* + 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 */ void smb_setup_ejs_string(void) @@ -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); } diff --git a/source4/scripting/libjs/base.js b/source4/scripting/libjs/base.js index c6b05755c4..181b3ca959 100644 --- a/source4/scripting/libjs/base.js +++ b/source4/scripting/libjs/base.js @@ -10,6 +10,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 */ function irpcObj() diff --git a/source4/setup/provision b/source4/setup/provision index c388a10bf9..f37907241e 100755 --- a/source4/setup/provision +++ b/source4/setup/provision @@ -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) diff --git a/testprogs/ejs/bugs.js b/testprogs/ejs/bugs.js index 01174f9eaf..3c8a4daab3 100644 --- a/testprogs/ejs/bugs.js +++ b/testprogs/ejs/bugs.js @@ -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(); diff --git a/testprogs/ejs/sprintf.js b/testprogs/ejs/sprintf.js index 34df4f9a42..4d3d9a7555 100755 --- a/testprogs/ejs/sprintf.js +++ b/testprogs/ejs/sprintf.js @@ -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"); |