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
*/
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);
}
}
HAVE_BASE_JS=1
+/*
+ an essential function!
+*/
+function printf()
+{
+ print(vsprintf(arguments));
+}
+
/*
helper function to setup a rpc io object, ready for input
*/
'nogroup=s',
'wheel=s',
'users=s',
- 'outputdir=s',
'quiet');
if (ok == false) {
println("Failed to parse options: " + options.ERROR);
--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)
/****************************************
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;
/****************************************
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");
/****************************************
demo a bug in constructing objects
no fix available yet
+status: SUBMITTED
*****************************************/
function MyObj() {
var o = new Object();
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) {
}
}
+/****************************************
+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();
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");
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");