@@ -62,11 +62,11 @@ return this.level; } this.decrLevel = function() { this.callframe[this.level] = null; this.level--; - if (this.level < 0) throw "Exit application"; + if (this.level < 0) this.level = 0; this.result = null; } this.getCommand = function(name) { try { return this.commands[name]; @@ -267,13 +267,14 @@ this.registerSubCommand("dict", "keys", function (interp, args) { if(args.length < 2 || args.length > 3) throw 'wrong # args: should be "dict keys dictionary ?globPattern?"'; var dict = args[1].toList(); var pattern = ".*"; - if(args.length == 3) pattern = "^"+args[2].toString().replace(/\*/g,".*"); + if(args.length == 3) + pattern = "^"+args[2].toString().replace(/\*/g,".*"); var res = []; - for (var i=0;i < dict.length;i+=2) { + for (var i = 0; i < dict.length; i+=2) { if(dict[i].toString().match(pattern)) res.push(dict[i]); } return res; }); this.registerSubCommand("dict", "set", function (interp, args) { @@ -396,17 +397,12 @@ this.registerSubCommand("file", "dirname", function (interp, args) { this.arity(args, 2); return interp.dirname(args[1].toString()); }); this.dirname = function(p) { // also used in [glob] - //require("path"); //not working :( - //return path.dirname(p.toString()); - if(p == ".") p = process.cwd(); - p = p.split("/"); - p.pop(); - if(p == "") return("/"); - return p.join("/"); + var path = require("path"); + return path.dirname(p.toString()); }; this.registerSubCommand("file", "exists", function (interp, args) { this.arity(args, 2); var file = args[1].toString(); try {var fd = fs.openSync(file,"r");} catch(e) {return 0;} @@ -418,20 +414,38 @@ var fn = args[1].toString(); var res = fn.split(".").pop(); res = (res == fn)? "" : "."+res; return res; }); + this.registerSubCommand("file", "join", function (interp, args) { + this.arity(args, 2, Infinity); + args.shift(); + var res = "", sep = ""; + for (var arg in args) { + var part = args[arg].toString(); + if(part.match("^[/]")) + res = part; else res = res+sep+part; + sep = "/"; + } + return res; + }); this.registerSubCommand("file", "mtime", function (interp, args) { this.arity(args, 2); var stat = fs.statSync(args[1].toString()); return stat.mtime.getTime()/1000; - }) + }); this.registerSubCommand("file", "size", function (interp, args) { this.arity(args, 2); var stat = fs.statSync(args[1].toString()); return stat.size; - }) + }); + this.registerSubCommand("file", "split", function (interp, args) { + this.arity(args, 2); + var path = args[1].toString().split("/"); + if(path[0] == "") path[0] = "/"; + return path; + }); this.registerSubCommand("file", "tail", function (interp, args) { this.arity(args, 2); return args[1].toString().split("/").pop(); }); this.registerCommand("for", function (interp, args) { @@ -497,21 +511,21 @@ //interp.timeout = setTimeout(function(){}, 10000); // if(interp.getsing==0) break; //} return; // result will be in interp.buf when done }); - this.gets = function(char) { +/* this.gets = function(char) { try { if(char.match(/foo[\r\n]/)) { this.getsing = 0; puts("received: "+this.buf); } else { puts("<"+char+">"+this.getsing); this.buf += char; } } catch(e) {puts(e)}; - } + }*/ this.registerCommand("glob", function (interp, args) { this.arity(args, 2, Infinity); args.shift(); var res = []; var prefix = "";