// BasicIO.java // FESI Copyright (c) Jean-Marc Lugrin, 1999 // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package FESI.Extensions; import FESI.Parser.*; import FESI.AST.*; import FESI.Interpreter.*; import FESI.Exceptions.*; import FESI.Data.*; import java.io.*; /** * Implements basic input/out capabilities for console based (stdin/stdout) * applications. *

The few functions allow minimal communication with the user (including * displaying error messages and prompting) in a way portable to windowing * environments. */ public class BasicIO extends Extension implements BasicIOInterface { // Implement the EcmaScript functions class GlobalObjectWrite extends BuiltinFunctionObject { GlobalObjectWrite(String name, Evaluator evaluator, FunctionPrototype fp) { super(fp, evaluator, name, 1); } public ESValue callFunction(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException { for (int i = 0; i0) theQuery = arguments[0].toString(); if (arguments.length>1) defaultValue = arguments[1].toString(); System.out.print(theQuery + " ["+defaultValue+"] ? "); System.out.flush(); String response = null; try { response = (new BufferedReader(new InputStreamReader(System.in))).readLine(); } catch (IOException e) { // response = null; } if (response==null || response.equals("")) response = defaultValue; return new ESString(response); } } class GlobalObjectConfirm extends BuiltinFunctionObject { GlobalObjectConfirm(String name, Evaluator evaluator, FunctionPrototype fp) { super(fp, evaluator, name, 2); } public ESValue callFunction(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException { String theQuery = "?"; if (arguments.length>0) theQuery = arguments[0].toString(); System.out.print(theQuery + " [y/n] ? "); System.out.flush(); String response = null; try { response = (new BufferedReader(new InputStreamReader(System.in))).readLine(); } catch (IOException e) { // response = null; } if (response!=null & response.trim().toLowerCase().startsWith("y")) { return ESBoolean.makeBoolean(true); } return ESBoolean.makeBoolean(false); } } class GlobalObjectExit extends BuiltinFunctionObject { GlobalObjectExit(String name, Evaluator evaluator, FunctionPrototype fp) { super(fp, evaluator, name, 1); } public ESValue callFunction(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException { int status = 0; if (arguments.length>0) { status=arguments[0].toInt32(); } System.exit(status); return null; // Never reached } } class GlobalObjectNoop extends BuiltinFunctionObject { GlobalObjectNoop(String name, Evaluator evaluator, FunctionPrototype fp) { super(fp, evaluator, name, 0); // 0 = Just some default value } public ESValue callFunction(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException { return ESUndefined.theUndefined; } } class GlobalObjectLoad extends BuiltinFunctionObject { GlobalObjectLoad(String name, Evaluator evaluator, FunctionPrototype fp) { super(fp, evaluator, name, 1); // 0 = Just some default value } public ESValue callFunction(ESObject thisObject, ESValue[] arguments) throws EcmaScriptException { String fileName = null; if (arguments.length>0) fileName = arguments[0].toString(); if (fileName == null) throw new EcmaScriptException("Missing file name for load"); File file = new File(fileName); ESValue value; try { //value = this.evaluator.evaluateLoadFile(file); value = this.evaluator.evaluateLoadModule(fileName); } catch (EcmaScriptParseException e) { e.setNeverIncomplete(); throw e; } return value; } } // Instance variables private Evaluator evaluator = null; private ESObject document = null; private ESObject window = null; /** * Create a new instance of the BasicIO extension */ public BasicIO () { super(); } // implements BasicIOInterface public ESObject getDocument() { return document; } /** * Initialize the extension */ public void initializeExtension(Evaluator evaluator) throws EcmaScriptException { this.evaluator = evaluator; GlobalObject go = evaluator.getGlobalObject(); document = ObjectObject.createObject(evaluator); window = ObjectObject.createObject(evaluator); FunctionPrototype fp = (FunctionPrototype) evaluator.getFunctionPrototype(); go.putHiddenProperty("document", document); document.putHiddenProperty("write", new GlobalObjectWrite("write", evaluator, fp)); document.putHiddenProperty("writeln", new GlobalObjectWriteln("writeln", evaluator, fp)); document.putHiddenProperty("open", new GlobalObjectNoop("open", evaluator, fp)); document.putHiddenProperty("close", new GlobalObjectNoop("close", evaluator, fp)); document.putHiddenProperty("URL", new ESString("file://")); go.putHiddenProperty("window", window); window.putHiddenProperty("alert", new GlobalObjectAlert("alert", evaluator, fp)); window.putHiddenProperty("prompt", new GlobalObjectPrompt("prompt", evaluator, fp)); window.putHiddenProperty("confirm", new GlobalObjectConfirm("confirm", evaluator, fp)); go.putHiddenProperty("write", new GlobalObjectWrite("write", evaluator, fp)); go.putHiddenProperty("writeln", new GlobalObjectWriteln("writeln", evaluator, fp)); go.putHiddenProperty("alert", new GlobalObjectAlert("alert", evaluator, fp)); go.putHiddenProperty("prompt", new GlobalObjectPrompt("prompt", evaluator, fp)); go.putHiddenProperty("confirm", new GlobalObjectConfirm("confirm", evaluator, fp)); go.putHiddenProperty("exit", new GlobalObjectExit("exit", evaluator, fp)); go.putHiddenProperty("load", new GlobalObjectLoad("load", evaluator, fp)); } }