Index: /lang/javascript/ijscript/lib/.init.js
===================================================================
--- /lang/javascript/ijscript/lib/.init.js (revision 5576)
+++ /lang/javascript/ijscript/lib/.init.js (revision 13972)
@@ -4,2 +4,3 @@
 eval(read('http://www.prototypejs.org/assets/2007/6/20/prototype.js'));
 eval(read('http://svn.coderepos.org/share/lang/javascript/clone/trunk/uneval.js'));
+eval(read('util/funcs.js'));
Index: /lang/javascript/ijscript/util/funcs.js
===================================================================
--- /lang/javascript/ijscript/util/funcs.js (revision 13972)
+++ /lang/javascript/ijscript/util/funcs.js (revision 13972)
@@ -0,0 +1,98 @@
+// funcs.js
+
+//
+function debug(msg) {
+  if (!debug.on)
+    return;
+  WScript.StdOut.WriteLine(msg);
+}
+
+//
+function map(a, f) {
+  var r = [];
+  for (var i = 0, m = a.length; i < m ; ++i)
+    r.push(f(a[i]));
+  return r;
+}
+
+//
+function each(a, f) {
+  for (var i = 0, m = a.length; i < m ; ++i)
+    f(a[i]);
+}
+
+//
+function cond(o) {
+  var f =
+    typeof o == 'function' ?
+      o :
+    o instanceof RegExp ?
+      function(e) { return o.test(e) } :
+      function() { return true };
+  return f;
+};
+
+//
+function grep(a, p) {
+  var f = cond(p);
+  var r = [];
+  for (var i = 0, m = a.length; i < m ; ++i) {
+    if (f(a[i]))
+      r.push(a[i]);
+  }
+  return r;
+}
+
+// touch('c:\\temp\\r.jpg', '1980/07/18 00:00:00')
+function touch(path, dt) {
+  var date = new Date(dt);
+  if (isNaN(date))
+    return false;
+
+  var shell = WScript.CreateObject('Shell.Application');
+  var fso = WScript.CreateObject('Scripting.FileSystemObject');
+  var parent = shell.NameSpace(fso.GetParentFolderName(path));
+  if (!parent)
+    return false;
+
+  var file = parent.ParseName(fso.GetFileName(path));
+  if (!file)
+    return false;
+
+  file.ModifyDate = date.getVarDate();
+
+  return true;
+}
+
+// ls -R
+function lsr(path, p) {
+  if (!path)
+    path = '.';
+
+  var fso = WScript.CreateObject('Scripting.FileSystemObject');
+  var f = cond(p);
+  var files;
+
+  if (fso.FileExists(path)) {
+    files = [];
+    var file = fso.GetFile(path);
+    if (f(file.Path))
+      files.push(file.Path);
+
+  } else if (fso.FolderExists(path)) {
+    var handler = function(fso, dir, f) {
+      var ret = [];
+      if (f(dir.Path))
+        ret.push(dir.Path);
+      ret = ret.concat(grep(
+        map(c2a(dir.Files), function(f) { return f.Path }),
+        f));
+      each(
+        c2a(dir.SubFolders),
+        function(d) { ret = ret.concat(handler(fso, d, f)) });
+      return ret;
+    }
+    files = handler(fso, fso.GetFolder(path), f);
+  }
+  return files;
+}
