Добавлены std::getBytes и std::stringFromBytes

This commit is contained in:
Victor 2019-04-12 19:12:35 +03:00
parent ccd06c98a6
commit ed164085c6
7 changed files with 78 additions and 3 deletions

View File

@ -1,7 +1,6 @@
package com.annimon.ownlang.lib;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.exceptions.UnknownPropertyException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

View File

@ -0,0 +1,29 @@
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.lib.ValueUtils;
import java.io.UnsupportedEncodingException;
public final class ArrayFunctions {
private ArrayFunctions() { }
static StringValue stringFromBytes(Value[] args) {
Arguments.checkOrOr(1, 2, args.length);
if (args[0].type() != Types.ARRAY) {
throw new TypeException("Array expected at first argument");
}
final byte[] bytes = ValueUtils.toByteArray((ArrayValue) args[0]);
final String charset = (args.length == 2) ? args[1].asString() : "UTF-8";
try {
return new StringValue(new String(bytes, charset));
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
}
}
}

View File

@ -1,20 +1,32 @@
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
import java.io.UnsupportedEncodingException;
public final class StringFunctions {
private StringFunctions() { }
static Value parseInt(Value... args) {
static ArrayValue getBytes(Value[] args) {
Arguments.checkOrOr(1, 2, args.length);
final String charset = (args.length == 2) ? args[1].asString() : "UTF-8";
try {
return ArrayValue.of(args[0].asString().getBytes(charset));
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
}
}
static Value parseInt(Value[] args) {
Arguments.checkOrOr(1, 2, args.length);
final int radix = (args.length == 2) ? args[1].asInt() : 10;
return NumberValue.of(Integer.parseInt(args[0].asString(), radix));
}
static Value parseLong(Value... args) {
static Value parseLong(Value[] args) {
Arguments.checkOrOr(1, 2, args.length);
final int radix = (args.length == 2) ? args[1].asInt() : 10;
return NumberValue.of(Long.parseLong(args[0].asString(), radix));

View File

@ -39,6 +39,7 @@ public final class std implements Module {
Functions.set("toHexString", NumberFunctions::toHexString);
// String
Functions.set("getBytes", StringFunctions::getBytes);
Functions.set("sprintf", new std_sprintf());
Functions.set("split", new std_split());
Functions.set("indexOf", new std_indexof());
@ -65,5 +66,6 @@ public final class std implements Module {
Functions.set("arrayValues", new std_arrayValues());
Functions.set("arraySplice", new std_arraySplice());
Functions.set("range", new std_range());
Functions.set("stringFromBytes", ArrayFunctions::stringFromBytes);
}
}

View File

@ -0,0 +1,15 @@
use ["std", "gzip"]
def testGzipText() {
text = trim("
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.
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.
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.
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.
")
bytes1 = getBytes(text)
bytesGzip = gzipBytes(bytes1)
bytes2 = ungzipBytes(bytesGzip)
assertEquals(bytes1.length, bytes2.length)
assertEquals(text, stringFromBytes(bytes2))
}

View File

@ -0,0 +1,9 @@
use "std"
def testGetBytes() {
assertEquals([111, 119, 110, 108, 97, 110, 103], getBytes("ownlang"))
}
def testGetBytesEmptyString() {
assertEquals([], getBytes(""))
}

View File

@ -0,0 +1,9 @@
use "std"
def testStringFromBytes() {
assertEquals("ownlang", stringFromBytes([111, 119, 110, 108, 97, 110, 103]))
}
def testStringFromEmptyString() {
assertEquals("", stringFromBytes([]))
}