Skip to content

Commit ed16408

Browse files
committed
Добавлены std::getBytes и std::stringFromBytes
1 parent ccd06c9 commit ed16408

File tree

7 files changed

+78
-3
lines changed

7 files changed

+78
-3
lines changed

src/main/java/com/annimon/ownlang/lib/ArrayValue.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.annimon.ownlang.lib;
22

33
import com.annimon.ownlang.exceptions.TypeException;
4-
import com.annimon.ownlang.exceptions.UnknownPropertyException;
54
import java.util.Arrays;
65
import java.util.Iterator;
76
import java.util.List;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.annimon.ownlang.modules.std;
2+
3+
import com.annimon.ownlang.exceptions.TypeException;
4+
import com.annimon.ownlang.lib.Arguments;
5+
import com.annimon.ownlang.lib.ArrayValue;
6+
import com.annimon.ownlang.lib.StringValue;
7+
import com.annimon.ownlang.lib.Types;
8+
import com.annimon.ownlang.lib.Value;
9+
import com.annimon.ownlang.lib.ValueUtils;
10+
import java.io.UnsupportedEncodingException;
11+
12+
public final class ArrayFunctions {
13+
14+
private ArrayFunctions() { }
15+
16+
static StringValue stringFromBytes(Value[] args) {
17+
Arguments.checkOrOr(1, 2, args.length);
18+
if (args[0].type() != Types.ARRAY) {
19+
throw new TypeException("Array expected at first argument");
20+
}
21+
final byte[] bytes = ValueUtils.toByteArray((ArrayValue) args[0]);
22+
final String charset = (args.length == 2) ? args[1].asString() : "UTF-8";
23+
try {
24+
return new StringValue(new String(bytes, charset));
25+
} catch (UnsupportedEncodingException uee) {
26+
throw new RuntimeException(uee);
27+
}
28+
}
29+
}

src/main/java/com/annimon/ownlang/modules/std/StringFunctions.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
package com.annimon.ownlang.modules.std;
22

33
import com.annimon.ownlang.lib.Arguments;
4+
import com.annimon.ownlang.lib.ArrayValue;
45
import com.annimon.ownlang.lib.NumberValue;
56
import com.annimon.ownlang.lib.Value;
7+
import java.io.UnsupportedEncodingException;
68

79
public final class StringFunctions {
810

911
private StringFunctions() { }
1012

11-
static Value parseInt(Value... args) {
13+
static ArrayValue getBytes(Value[] args) {
14+
Arguments.checkOrOr(1, 2, args.length);
15+
final String charset = (args.length == 2) ? args[1].asString() : "UTF-8";
16+
try {
17+
return ArrayValue.of(args[0].asString().getBytes(charset));
18+
} catch (UnsupportedEncodingException uee) {
19+
throw new RuntimeException(uee);
20+
}
21+
}
22+
23+
static Value parseInt(Value[] args) {
1224
Arguments.checkOrOr(1, 2, args.length);
1325
final int radix = (args.length == 2) ? args[1].asInt() : 10;
1426
return NumberValue.of(Integer.parseInt(args[0].asString(), radix));
1527
}
1628

17-
static Value parseLong(Value... args) {
29+
static Value parseLong(Value[] args) {
1830
Arguments.checkOrOr(1, 2, args.length);
1931
final int radix = (args.length == 2) ? args[1].asInt() : 10;
2032
return NumberValue.of(Long.parseLong(args[0].asString(), radix));

src/main/java/com/annimon/ownlang/modules/std/std.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public void init() {
3939
Functions.set("toHexString", NumberFunctions::toHexString);
4040

4141
// String
42+
Functions.set("getBytes", StringFunctions::getBytes);
4243
Functions.set("sprintf", new std_sprintf());
4344
Functions.set("split", new std_split());
4445
Functions.set("indexOf", new std_indexof());
@@ -65,5 +66,6 @@ public void init() {
6566
Functions.set("arrayValues", new std_arrayValues());
6667
Functions.set("arraySplice", new std_arraySplice());
6768
Functions.set("range", new std_range());
69+
Functions.set("stringFromBytes", ArrayFunctions::stringFromBytes);
6870
}
6971
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use ["std", "gzip"]
2+
3+
def testGzipText() {
4+
text = trim("
5+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In leo dui, venenatis eu eleifend ut, volutpat vitae risus. Vivamus sed massa consectetur, fermentum est ac, semper ligula. Donec vel facilisis urna. Cras scelerisque libero a pulvinar mollis. Maecenas elementum, lectus vitae ullamcorper viverra, odio justo interdum lacus, a dictum mauris lacus id neque. Donec ante nibh, ornare ac lacus at, rutrum vulputate lacus. Quisque aliquet sem sit amet nisl semper faucibus. Aenean finibus sodales est, eget efficitur nibh. Donec ut tortor ut ex auctor fringilla id sed neque. Aenean id placerat ipsum.
6+
Etiam enim ligula, vulputate ac velit nec, accumsan blandit velit. Aenean tortor neque, ornare eu quam vel, viverra condimentum erat. In vitae mattis augue. Sed nec auctor est. Aenean in auctor lorem. Etiam non accumsan arcu. Vivamus purus massa, finibus at ultrices feugiat, congue vitae quam.
7+
Vestibulum porttitor finibus nulla, vel mollis elit luctus vel. Phasellus ut erat ante. Praesent consectetur vulputate sem eget bibendum. Etiam porttitor magna et egestas viverra. Praesent urna eros, porttitor vitae lorem sodales, luctus sagittis velit. Donec sed aliquet nulla, ac gravida urna. Mauris at quam eros. Nam dolor lacus, laoreet vel consequat non, semper sed quam. Nunc semper interdum arcu eget iaculis. Vivamus at turpis et urna pellentesque suscipit in nec tellus. Nam sed sem ut ipsum semper imperdiet in et est. Praesent vestibulum augue a dolor consequat feugiat. Nam massa tortor, feugiat quis orci ut, blandit varius tellus. Quisque et blandit erat.
8+
Fusce ultricies, odio scelerisque venenatis pellentesque, nisl mi vehicula mi, eu ultrices dui nisi ac elit. Nullam laoreet et lacus ac fringilla. Morbi pretium, eros non facilisis bibendum, nisl ex ultricies ipsum, sed sodales est felis vel eros. Suspendisse lobortis lectus scelerisque turpis dapibus, et tristique neque faucibus. Donec sed tellus id augue molestie tempus ac in urna. Morbi accumsan velit in erat ultricies, vitae ultricies nulla viverra. Pellentesque non euismod purus. Pellentesque vitae consequat orci. Pellentesque in nulla pulvinar, blandit leo sed, vehicula quam. Cras finibus libero ut diam aliquam efficitur. Vestibulum rutrum tincidunt posuere. Integer ultricies rutrum libero vitae pellentesque. Nulla blandit ipsum sit amet aliquet venenatis. Maecenas cursus massa quis massa posuere eleifend. Morbi vel lorem luctus, efficitur nibh id, sagittis tortor. Maecenas tristique suscipit dui vel congue.
9+
")
10+
bytes1 = getBytes(text)
11+
bytesGzip = gzipBytes(bytes1)
12+
bytes2 = ungzipBytes(bytesGzip)
13+
assertEquals(bytes1.length, bytes2.length)
14+
assertEquals(text, stringFromBytes(bytes2))
15+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use "std"
2+
3+
def testGetBytes() {
4+
assertEquals([111, 119, 110, 108, 97, 110, 103], getBytes("ownlang"))
5+
}
6+
7+
def testGetBytesEmptyString() {
8+
assertEquals([], getBytes(""))
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use "std"
2+
3+
def testStringFromBytes() {
4+
assertEquals("ownlang", stringFromBytes([111, 119, 110, 108, 97, 110, 103]))
5+
}
6+
7+
def testStringFromEmptyString() {
8+
assertEquals("", stringFromBytes([]))
9+
}

0 commit comments

Comments
 (0)