Добавлено множество восхитительных функций

This commit is contained in:
Victor 2016-01-23 12:50:10 +02:00
parent 95ca908243
commit 45ef0f88bb
9 changed files with 136 additions and 1 deletions

View File

@ -8,6 +8,8 @@ import java.util.Objects;
*/ */
public final class StringValue implements Value { public final class StringValue implements Value {
public static final StringValue EMPTY = new StringValue("");
private final String value; private final String value;
public StringValue(String value) { public StringValue(String value) {

View File

@ -0,0 +1,54 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*;
public final class robot_exec implements Function {
public static enum Mode { EXEC, EXEC_AND_WAIT };
private final Mode mode;
public robot_exec(Mode mode) {
this.mode = mode;
}
@Override
public Value execute(Value... args) {
if (args.length == 0) throw new ArgumentsMismatchException("At least one argument expected");
try {
final Process process;
if (args.length > 1) {
process = Runtime.getRuntime().exec(toStringArray(args));
} else switch (args[0].type()) {
case Types.ARRAY:
final ArrayValue array = (ArrayValue) args[0];
process = Runtime.getRuntime().exec(toStringArray(array.getCopyElements()));
break;
default:
process = Runtime.getRuntime().exec(args[0].asString());
}
switch (mode) {
case EXEC_AND_WAIT:
return new NumberValue(process.waitFor());
case EXEC:
default:
return NumberValue.ZERO;
}
} catch (Exception ex) {
ex.printStackTrace();
return NumberValue.ZERO;
}
}
private static String[] toStringArray(Value[] values) {
final String[] strings = new String[values.length];
for (int i = 0; i < values.length; i++) {
strings[i] = values[i].asString();
}
return strings;
}
}

View File

@ -0,0 +1,21 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Value;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
public final class robot_fromclipboard implements Function {
@Override
public Value execute(Value... args) {
try {
Object data = Toolkit.getDefaultToolkit().getSystemClipboard()
.getData(DataFlavor.stringFlavor);
return new StringValue(data.toString());
} catch (Exception ex) {
return StringValue.EMPTY;
}
}
}

View File

@ -0,0 +1,20 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
public final class robot_toclipboard implements Function {
@Override
public Value execute(Value... args) {
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected");
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(new StringSelection(args[0].asString()), null);
return NumberValue.ZERO;
}
}

View File

@ -0,0 +1,14 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.*;
import java.util.Scanner;
public final class std_readln implements Function {
@Override
public Value execute(Value... args) {
try (Scanner sc = new Scanner(System.in)) {
return new StringValue(sc.nextLine());
}
}
}

View File

@ -0,0 +1,13 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
public final class std_time implements Function {
@Override
public Value execute(Value... args) {
return new NumberValue(System.currentTimeMillis());
}
}

View File

@ -2,6 +2,9 @@ package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException; import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.robot_exec;
import com.annimon.ownlang.lib.modules.functions.robot_fromclipboard;
import com.annimon.ownlang.lib.modules.functions.robot_toclipboard;
import java.awt.AWTException; import java.awt.AWTException;
import java.awt.Robot; import java.awt.Robot;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
@ -53,6 +56,10 @@ public final class robot implements Module {
} catch (IllegalArgumentException iae) { } } catch (IllegalArgumentException iae) { }
return NumberValue.ZERO; return NumberValue.ZERO;
}); });
Functions.set("toClipboard", new robot_toclipboard());
Functions.set("fromClipboard", new robot_fromclipboard());
Functions.set("execProcess", new robot_exec(robot_exec.Mode.EXEC));
Functions.set("execProcessAndWait", new robot_exec(robot_exec.Mode.EXEC_AND_WAIT));
Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN)); Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN));
Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT)); Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT));

View File

@ -12,10 +12,12 @@ public final class std implements Module {
@Override @Override
public void init() { public void init() {
Functions.set("echo", new std_echo()); Functions.set("echo", new std_echo());
Functions.set("readln", new std_readln());
Functions.set("newarray", new std_newarray()); Functions.set("newarray", new std_newarray());
Functions.set("sort", new std_sort()); Functions.set("sort", new std_sort());
Functions.set("length", new std_length()); Functions.set("length", new std_length());
Functions.set("rand", new std_rand()); Functions.set("rand", new std_rand());
Functions.set("time", new std_time());
Functions.set("sleep", new std_sleep()); Functions.set("sleep", new std_sleep());
Functions.set("thread", new std_thread()); Functions.set("thread", new std_thread());

View File

@ -22,7 +22,9 @@ public final class UseStatement implements Statement {
final String moduleName = expression.eval().asString(); final String moduleName = expression.eval().asString();
final Module module = (Module) Class.forName(PACKAGE + moduleName).newInstance(); final Module module = (Module) Class.forName(PACKAGE + moduleName).newInstance();
module.init(); module.init();
} catch (Exception ex) { } } catch (Exception ex) {
throw new RuntimeException(ex);
}
} }
@Override @Override