From 1957c8e7e06b4af37802acf80b758ffd7b3dfd4b Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 22 Jan 2016 18:15:58 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=D0=BE=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- program.own | 7 +++- .../lib/modules/functions/std_charat.java | 17 ++++++++ .../lib/modules/functions/std_indexof.java | 18 ++++++++ .../lib/modules/functions/std_join.java | 41 +++++++++++++++++++ .../modules/functions/std_lastindexof.java | 18 ++++++++ .../lib/modules/functions/std_replace.java | 18 ++++++++ .../lib/modules/functions/std_replaceall.java | 18 ++++++++ .../modules/functions/std_replacefirst.java | 18 ++++++++ .../lib/modules/functions/std_split.java | 24 +++++++++++ .../lib/modules/functions/std_sprintf.java | 19 +++++++++ .../lib/modules/functions/std_substring.java | 25 +++++++++++ .../lib/modules/functions/std_tochar.java | 14 +++++++ .../modules/functions/std_tolowercase.java | 14 +++++++ .../modules/functions/std_touppercase.java | 14 +++++++ .../lib/modules/functions/std_trim.java | 14 +++++++ src/com/annimon/ownlang/lib/modules/std.java | 16 ++++++++ 16 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_charat.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_indexof.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_join.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_replace.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_replaceall.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_replacefirst.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_split.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_substring.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_tochar.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_tolowercase.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_touppercase.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/std_trim.java diff --git a/program.own b/program.own index 11aafe2..c8c5f99 100644 --- a/program.own +++ b/program.own @@ -180,4 +180,9 @@ class = { "div": def(a, b) = a / b } -println class.add(2, class.mul(2, 2)) \ No newline at end of file +println class.add(2, class.mul(2, 2)) + +println split("1/2/3/4/5/6", "/") +println join(nums, ", ") +println join(nums, "|", "/") +println join(nums, ", ", "[", "]") \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_charat.java b/src/com/annimon/ownlang/lib/modules/functions/std_charat.java new file mode 100644 index 0000000..3a24931 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_charat.java @@ -0,0 +1,17 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_charat implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected"); + + final String input = args[0].asString(); + final int index = (int) args[1].asNumber(); + + return new NumberValue(input.charAt(index)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java b/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java new file mode 100644 index 0000000..032871a --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java @@ -0,0 +1,18 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_indexof implements Function { + + @Override + public Value execute(Value... args) { + if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); + + final String input = args[0].asString(); + final String what = args[1].asString(); + final int index = (args.length == 3) ? ((int) args[2].asNumber()) : 0; + + return new NumberValue(input.indexOf(what, index)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_join.java b/src/com/annimon/ownlang/lib/modules/functions/std_join.java new file mode 100644 index 0000000..3cff847 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_join.java @@ -0,0 +1,41 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.exceptions.TypeException; +import com.annimon.ownlang.lib.*; + +public final class std_join implements Function { + + @Override + public Value execute(Value... args) { + if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected"); + if (args[0].type() != Types.ARRAY) { + throw new TypeException("Array expected in first argument"); + } + + final ArrayValue array = (ArrayValue) args[0]; + switch (args.length) { + case 1: + return join(array, "", "", ""); + case 2: + return join(array, args[1].asString(), "", ""); + case 3: + return join(array, args[1].asString(), args[2].asString(), args[2].asString()); + case 4: + return join(array, args[1].asString(), args[2].asString(), args[3].asString()); + default: + throw new ArgumentsMismatchException("Wrong number of arguments"); + } + } + + private static StringValue join(ArrayValue array, String delimiter, String prefix, String suffix) { + final StringBuilder sb = new StringBuilder(); + for (Value value : array) { + if (sb.length() > 0) sb.append(delimiter); + else sb.append(prefix); + sb.append(value.asString()); + } + sb.append(suffix); + return new StringValue(sb.toString()); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java b/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java new file mode 100644 index 0000000..5b10251 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java @@ -0,0 +1,18 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_lastindexof implements Function { + + @Override + public Value execute(Value... args) { + if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); + + final String input = args[0].asString(); + final String what = args[1].asString(); + final int index = (args.length == 3) ? ((int) args[2].asNumber()) : 0; + + return new NumberValue(input.lastIndexOf(what, index)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_replace.java b/src/com/annimon/ownlang/lib/modules/functions/std_replace.java new file mode 100644 index 0000000..b9746b5 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_replace.java @@ -0,0 +1,18 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_replace implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected"); + + final String input = args[0].asString(); + final String target = args[1].asString(); + final String replacement = args[2].asString(); + + return new StringValue(input.replace(target, replacement)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_replaceall.java b/src/com/annimon/ownlang/lib/modules/functions/std_replaceall.java new file mode 100644 index 0000000..9539c23 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_replaceall.java @@ -0,0 +1,18 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_replaceall implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected"); + + final String input = args[0].asString(); + final String regex = args[1].asString(); + final String replacement = args[2].asString(); + + return new StringValue(input.replaceAll(regex, replacement)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_replacefirst.java b/src/com/annimon/ownlang/lib/modules/functions/std_replacefirst.java new file mode 100644 index 0000000..24557ed --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_replacefirst.java @@ -0,0 +1,18 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_replacefirst implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected"); + + final String input = args[0].asString(); + final String regex = args[1].asString(); + final String replacement = args[2].asString(); + + return new StringValue(input.replaceFirst(regex, replacement)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_split.java b/src/com/annimon/ownlang/lib/modules/functions/std_split.java new file mode 100644 index 0000000..13f2bde --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_split.java @@ -0,0 +1,24 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_split implements Function { + + @Override + public Value execute(Value... args) { + if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); + + final String input = args[0].asString(); + final String regex = args[1].asString(); + final int limit = (args.length == 3) ? ((int) args[2].asNumber()) : 0; + + final String[] parts = input.split(regex, limit); + final ArrayValue result = new ArrayValue(parts.length); + for (int i = 0; i < parts.length; i++) { + result.set(i, new StringValue(parts[i])); + } + + return result; + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java b/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java new file mode 100644 index 0000000..1767be6 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_sprintf.java @@ -0,0 +1,19 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_sprintf implements Function { + + @Override + public Value execute(Value... args) { + if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected"); + + final String format = args[0].asString(); + final Object[] values = new Object[args.length - 1]; + for (int i = 1; i < args.length; i++) { + values[i - 1] = (args[i].type() == Types.NUMBER) ? args[i].asNumber() : args[i].asString(); + } + return new StringValue(String.format(format, values)); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_substring.java b/src/com/annimon/ownlang/lib/modules/functions/std_substring.java new file mode 100644 index 0000000..22e697a --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_substring.java @@ -0,0 +1,25 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_substring implements Function { + + @Override + public Value execute(Value... args) { + if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected"); + + final String input = args[0].asString(); + final int startIndex = (int) args[1].asNumber(); + + String result; + if (args.length == 2) { + result = input.substring(startIndex); + } else { + final int endIndex = (int) args[2].asNumber(); + result = input.substring(startIndex, endIndex); + } + + return new StringValue(result); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_tochar.java b/src/com/annimon/ownlang/lib/modules/functions/std_tochar.java new file mode 100644 index 0000000..00b5c25 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_tochar.java @@ -0,0 +1,14 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_tochar implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); + + return new StringValue(String.valueOf((char) args[0].asNumber())); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_tolowercase.java b/src/com/annimon/ownlang/lib/modules/functions/std_tolowercase.java new file mode 100644 index 0000000..ace2248 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_tolowercase.java @@ -0,0 +1,14 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_tolowercase implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); + + return new StringValue(args[0].asString().toLowerCase()); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_touppercase.java b/src/com/annimon/ownlang/lib/modules/functions/std_touppercase.java new file mode 100644 index 0000000..3a9d67b --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_touppercase.java @@ -0,0 +1,14 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_touppercase implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); + + return new StringValue(args[0].asString().toUpperCase()); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_trim.java b/src/com/annimon/ownlang/lib/modules/functions/std_trim.java new file mode 100644 index 0000000..7f08e76 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_trim.java @@ -0,0 +1,14 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.lib.*; + +public final class std_trim implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 1) throw new ArgumentsMismatchException("One argument expected"); + + return new StringValue(args[0].asString().trim()); + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/std.java b/src/com/annimon/ownlang/lib/modules/std.java index fe986ea..6958732 100644 --- a/src/com/annimon/ownlang/lib/modules/std.java +++ b/src/com/annimon/ownlang/lib/modules/std.java @@ -18,5 +18,21 @@ public final class std implements Module { Functions.set("rand", new std_rand()); Functions.set("sleep", new std_sleep()); Functions.set("thread", new std_thread()); + + // String + Functions.set("sprintf", new std_sprintf()); + Functions.set("split", new std_split()); + Functions.set("join", new std_join()); + Functions.set("indexOf", new std_indexof()); + Functions.set("lastIndexOf", new std_lastindexof()); + Functions.set("charAt", new std_charat()); + Functions.set("toChar", new std_tochar()); + Functions.set("substring", new std_substring()); + Functions.set("toLowerCase", new std_tolowercase()); + Functions.set("toUpperCase", new std_touppercase()); + Functions.set("trim", new std_trim()); + Functions.set("replace", new std_replace()); + Functions.set("replaceAll", new std_replaceall()); + Functions.set("replaceFirst", new std_replacefirst()); } }