/*====================================================
* rapl_pkg_stringcmd.js "A Tcl like language implementation in Javascript named WebRAPL
* (Web Rapid Application Programming Language)"
*
* RAPL string commands implementation
*
* Released under BSD license.
* (BSD license found at <http://www.tcl.tk/software/tcltk/license.html>)
*
* Arnulf Wiedemann 2011
*/
RP.add("rapl-pkg-string", function(R, name) {
function PkgString(interp) {
R.log('constructor called', '2.life', 'PkgString', true);
// kweight
var strg = this;
strg.interp = interp;
var constructor = strg.constructor;
PkgString.superclass.constructor.apply(strg, arguments);
R.Base.pkg_string_oid++;
strg.oid = R.Base.pkg_string_oid;
/* ==================== command string first ===================================== */
interp.registerSubCommand("::string", "first", function (interp, args) {
var idx = 0;
var needle_len;
var haystack_len;
var needle_str;
var haystack_str;
if (args.length != 3 && args.length != 4) {
interp.wrongNumArgs(1, args, "subString string ?index?");
return interp.ERROR;
}
needle_str = args[1].getString();
haystack_str = args[2].getString();
needle_len = args[1].length;
haystack_len = args[2].length;
if (args.length == 4) {
var res = new Array();
if (interp.index_obj_type.getIndex(args[3], res) != interp.OK) {
return interp.ERROR;
}
idx = interp.index_obj_type.relToAbsIndex(haystack_len, res[0]);
}
interp.setResultInt(interp.string_obj_type.stringFirst(needle_str, needle_len, haystack_str, haystack_len, idx));
return interp.OK;
});
/* ==================== command string equal ===================================== */
interp.registerSubCommand("::string", "equal", function (interp, args) {
this.requireExactArgc(args, 3, "string equal", "");
return (args[1].toString() == args[2].toString());
});
/* ==================== command string index ===================================== */
interp.registerSubCommand("::string", "index", function (interp, args) {
this.requireExactArgc(args, 3, "string index", "");
var s = args[1].toString();
try {
return s.charAt(args[1].stringIndex(args[2]));
} catch (e) {
return "";
}
});
/* ==================== command string last ===================================== */
interp.registerSubCommand("::string", "last", function (interp, args) {
var idx = 0;
var needle_len;
var haystack_len;
var needle_str;
var haystack_str;
if (args.length != 3 && args.length != 4) {
interp.wrongNumArgs(1, args, "subString string ?index?");
return interp.ERROR;
}
needle_str = args[1].getString();
haystack_str = args[2].getString();
needle_len = args[1].length;
haystack_len = args[2].length;
if (args.length == 4) {
var res = new Array();
if (interp.index_obj_type.getIndex(args[3], res) != interp.OK) {
return interp.ERROR;
}
idx = interp.index_obj_type.relToAbsIndex(haystack_len, res[0]);
} else {
idx = haystack_len;
}
interp.setResultInt(interp.string_obj_type.stringLast(needle_str, needle_len, haystack_str, haystack_len, idx));
return interp.OK;
});
/* ==================== command string match ===================================== */
interp.registerSubCommand("::string", "match", function (interp, args) {
args.shift();
this.requireMinArgc(args, 2, "string match", "");
var usage = "string match ?-nocase? pattern string";
var nocase = 0;
var pattern = args.shift().toString();
if (pattern == "-nocase") {
if (args.length < 3) {
throw usage;
}
nocase = 1;
pattern = args.shift().toString();
}
pattern = Tcl.toGlob(interp, pattern);
if (nocase) {
pattern = new RegExp(pattern, "i");
} else {
pattern = new RegExp(pattern);
}
var str = args.shift().toString();
try {
var result = pattern.test(str);
return result;
} catch (e) {
return "";
}
});
/* ==================== command string range ===================================== */
interp.registerSubCommand("::string", "range", function (interp, args) {
this.requireExactArgc(args, 4, "string range", "");
var s = args[1];
try {
var b = s.stringIndex(args[2].toString());
var e = s.stringIndex(args[3].toString());
if (b > e) return "";
return s.toString().substring(b, e + 1);
} catch (e) {
return "";
}
});
/* ==================== command string tolower ===================================== */
interp.registerSubCommand("::string", "tolower", function (interp, args) {
var s;
var first = 0;
var last;
var idx;
var head = "";
var tail = "";
var mid;
if (args.length < 2 || args.length > 4) {
interp.wrongNumArgs(1, args, "string");
return interp.ERROR;
}
s = args[1].getString();
last = s.length;
if (args.length > 2) {
idx = new Array();
if (interp.index_obj_type.getIndex(args[2], idx) != interp.OK) {
return interp.ERROR;
}
first = idx[0];
first = interp.relToAbsIndex(s.length, first);
}
if (args.length > 3) {
if (interp.index_obj_type.getIndex(args[3], idx) != interp.OK) {
return interp.ERROR;
}
last = idx[0];
last = interp.relToAbsIndex(s.length, last);
}
if (first > last) {
interp.setResultString("string tolower end index must be equal or greater the start index");
return interp.ERROR;
}
if (first > 0) {
head = s.substring(0, first);
}
mid = s.substring(first, last).toLowerCase();
if (last < s.length) {
tail = s.substring(last);
}
s = head+mid+tail;
interp.setResultString(s);
return interp.OK;
});
/* ==================== command string toupper ===================================== */
interp.registerSubCommand("::string", "toupper", function (interp, args) {
var s;
var first = 0;
var last;
var idx;
var head = "";
var tail = "";
var mid;
if (args.length < 2 || args.length > 4) {
interp.wrongNumArgs(1, args, "string ?first? ?last?");
return interp.ERROR;
}
s = args[1].getString();
last = s.length;
if (args.length > 2) {
idx = new Array();
if (interp.index_obj_type.getIndex(args[2], idx) != interp.OK) {
return interp.ERROR;
}
first = idx[0];
first = interp.relToAbsIndex(s.length, first);
}
if (args.length > 3) {
if (interp.index_obj_type.getIndex(args[3], idx) != interp.OK) {
return interp.ERROR;
}
last = idx[0];
last = interp.relToAbsIndex(s.length, last);
}
if (first > 0) {
head = s.substring(0, first);
}
mid = s.substring(first, last).toUpperCase();
if (last < s.length) {
tail = s.substring(last);
}
s = head+mid+tail;
interp.setResultString(s);
return interp.OK;
});
/* ==================== command string trim ===================================== */
interp.registerSubCommand("::string", "trim", function (interp, args) {
if (args.length != 2 && args.length != 3) {
interp.wrongNumArgs(1, args, "string ?trimchars?");
return interp.ERROR;
}
var trim_chars = (args.length == 3 ? args[2] : null);
var s = args[1];
interp.setResult(interp.string_obj_type.stringTrim(s, trim_chars));
return interp.OK;
});
/* ==================== command string trimleft ===================================== */
interp.registerSubCommand("::string", "trimleft", function (interp, args) {
if (args.length != 2 && args.length != 3) {
interp.wrongNumArgs(1, args, "string ?trimchars?");
return interp.ERROR;
}
var trim_chars = (args.length == 3 ? args[2] : null);
var s = args[1];
interp.setResult(interp.string_obj_type.stringTrimLeft(s, trim_chars));
return interp.OK;
});
/* ==================== command string trimright ===================================== */
interp.registerSubCommand("::string", "trimright", function (interp, args) {
if (args.length != 2 && args.length != 3) {
interp.wrongNumArgs(1, args, "string ?trimchars?");
return interp.ERROR;
}
var trim_chars = (args.length == 3 ? args[2] : null);
var s = args[1];
interp.setResult(interp.string_obj_type.stringTrimRight(s, trim_chars));
return interp.OK;
});
R.log('constructor end', '2.life', 'PkgString', true);
}
R.extend(PkgString, R.Token, {
my_name: "PkgString",
});
PkgString.prototype.constructor = PkgString;
R.PkgString = PkgString;
}, "0.0.1", {});