package org.jerlang.erts.erlang; import org.jerlang.type.Binary; import org.jerlang.type.Integer; import org.jerlang.type.List; import org.jerlang.type.Term; import org.jerlang.type.Tuple; public class ErlangBinaryPart { private ErlangBinaryPart() { } public static Term dispatch(List params) { Binary subject = params.head().toBinary(); switch (params.length()) { case 2: params = params.tail(); Tuple posLen = params.head().toTuple(); return binary_part_2(subject, posLen); case 3: params = params.tail(); Integer start = params.head().toInteger(); params = params.tail(); Integer length = params.head().toInteger(); return binary_part_3(subject, start, length); default: throw Error.badarg; } } /** * Extracts the part of the binary described by PosLen. * * Negative length can be used to extract bytes at the end of a binary: * * 1> Bin = <<1,2,3,4,5,6,7,8,9,10>>. * 2> binary_part(Bin,{byte_size(Bin), -5}). * <<6,7,8,9,10>> * * If PosLen in any way references outside the binary, * a badarg exception is raised. * * Start is zero-based, i.e.: * * 1> Bin = <<1,2,3>> * 2> binary_part(Bin,{0,2}). * <<1,2>> * * See the STDLIB module binary for details about the PosLen semantics. * * Allowed in guard tests. * * http://www.erlang.org/doc/man/erlang.html#binary_part-2 */ public static Binary binary_part_2(Binary subject, Tuple posLen) { Integer start = posLen.element(1).toInteger(); Integer length = posLen.element(2).toInteger(); return binary_part_3(subject, start, length); } /** * The same as binary_part(Subject, {Start, Length}). * Allowed in guard tests. * * http://www.erlang.org/doc/man/erlang.html#binary_part-3 */ public static Binary binary_part_3(Binary subject, Integer start, Integer length) { return subject.part(start.toInt(), length.toInt()); } }