// // Communicate with cscript via stdin/stderr // // For using vm-commands must be run from 32-bit cscript (true if Ruby is 32-bit) // +function(){

var

w = WScript,
i = w.StdIn,
o = w.StdErr,
vms = {},
lastShim

loadShivs('json2 es5')

while(!i.AtEndOfStream)

o.WriteLine(wrap(i.ReadLine()))

function wrap(s) {

try { s=compile(s) }
catch(e) { s={err: e.message || 'General error'} }
try { return JSON.stringify(s) }
catch(e) { return '{"err":"JSON.stringify error"}' }

}

function compile(s) {

s = JSON.parse(s)
switch(typeof s)
{
  case 'string':
    return ok(new Function(s)())
  case 'object':
    return vmCmd(s)
  default:
    throw Error('String expected!')
}

}

function ok(v) {

return 'undefined'==typeof v ? {} : {ok: v}

}

function jsText(name) {

var
  fso = new ActiveXObject("Scripting.FileSystemObject")
name = fso.GetParentFolderName(w.ScriptFullName)+"/"+name+".js"
return fso.OpenTextFile(name).ReadAll()

}

function loadShivs(names) {

names = names.split(' ')
for(var i in names)
  new Function(lastShim = jsText(names[i]))()

}

function vmCmd(s) {

if(!('vm' in s))
  throw Error('VM command expected!')
if('js' in s)
  return vmEval(s)
if(!s.vm)
  return {vm: vmNew()}
delete vms[s.vm]
return {}

}

function vmNew() {

var i, r
for(i = 10; i>0; i--)
  if((r = /\d{3,}/.exec(Math.random())) && !vms[r = r[0]])
  {
    vms[r] = i = new ActiveXObject('ScriptControl')
    i.Language = 'JScript'
    i.addCode(lastShim)
    return r
  }
throw Error('Cannot generate random number')

}

function vmEval(s) {

var z = vms[s.vm]
if(!z)
  throw Error('VM not found')
if('string'!=typeof s.js)
  throw Error('String expected!')
return ok(z.eval('new Function('+JSON.stringify(s.js)+')()'))

}

}()