Packages

GLEB128 is a small Gleam library that provides functions for encoding and decoding LEB128 (Little Endian Base 128) integers.

Current section

Files

Jump to
gleb128 src gleb128@internal@native.erl
Raw

src/gleb128@internal@native.erl

-module(gleb128@internal@native).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([get_cpu_endianness/0, decode_native_unsigned_integer/2, decode_native_signed_integer/2]).
-export_type([endianness/0]).
-type endianness() :: big | little.
-file("/home/neofox/gleb128/src/gleb128/internal/native.gleam", 13).
-spec get_cpu_endianness() -> {ok, endianness()} | {error, binary()}.
get_cpu_endianness() ->
case <<16#01:32/native>> of
<<16#01, 16#00, 16#00, 16#00>> ->
{ok, little};
<<16#00, 16#00, 16#00, 16#01>> ->
{ok, big};
_ ->
{error,
<<"Can't determine CPU's endianness. Maybe the CPU uses a mixed-endian format?"/utf8>>}
end.
-file("/home/neofox/gleb128/src/gleb128/internal/native.gleam", 26).
-spec decode_native_unsigned_integer(bitstring(), endianness()) -> integer().
decode_native_unsigned_integer(Data, Endianness) ->
binary:decode_unsigned(Data, Endianness).
-file("/home/neofox/gleb128/src/gleb128/internal/native.gleam", 40).
-spec decode_native_signed_integer(bitstring(), endianness()) -> integer().
decode_native_signed_integer(Data, Endianness) ->
Size_in_bits = erlang:byte_size(Data) * 8,
case {Endianness, Data} of
{little, <<X:Size_in_bits/signed-little>>} ->
X;
{big, <<X@1:Size_in_bits/signed-big>>} ->
X@1;
{_, _} ->
0
end.