From 5d38fc0aefac0365b091b3ba99a5178ec3d29d11 Mon Sep 17 00:00:00 2001 From: Kresten Krab Thorup Date: Tue, 20 Aug 2013 15:54:59 +0200 Subject: [PATCH] Add binary:part/2,3 BIFs --- src/main/java/erjang/m/binary/Native.java | 39 +++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/erjang/m/binary/Native.java b/src/main/java/erjang/m/binary/Native.java index 6d330fe7..9d9a2cad 100644 --- a/src/main/java/erjang/m/binary/Native.java +++ b/src/main/java/erjang/m/binary/Native.java @@ -332,17 +332,50 @@ static boolean looking_at(byte[] haystack, int off, byte[] needle) { */ @BIF public static EBinary part(EObject subject, EObject poslen) { - throw new NotImplemented(); + EBinary sub = subject.testBinary(); + ETuple2 pl = ETuple2.cast(poslen); + ESmall pos, len; + if (sub == null + || pl == null + || (pos=pl.elem1.testSmall()) == null + || (len=pl.elem2.testSmall()) == null + ) { + throw ERT.badarg(subject, poslen); + } + + return part(sub, pos.value, len.value, false); } /** * part(Subject, Pos, Len) -> binary() */ @BIF - public static EBinary part(EObject subject, EObject pos, EObject len) { - throw new NotImplemented(); + public static EBinary part(EObject subject, EObject opos, EObject olen) { + EBinary sub = subject.testBinary(); + ESmall pos, len; + if (sub == null + || (pos=opos.testSmall()) == null + || (len=olen.testSmall()) == null + ) { + throw ERT.badarg(subject, opos, olen); + } + + return part(sub, pos.value, len.value, false); } + private static EBinary part(EBinary sub, int pos, int len, boolean as_guard) { + if (len < 0) { + pos = pos + len; + len = -len; + } + + if (pos < 0 || (pos + len) > sub.byteSize()) { + throw ERT.badarg(sub, ERT.box(pos), ERT.box(len)); + } + + return sub.sub_binary(pos, len); + } + /** * referenced_byte_size(binary()) -> int() */