Current section
Files
Jump to
Current section
Files
src/multipartkit@internal@bytes.erl
-module(multipartkit@internal@bytes).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/multipartkit/internal/bytes.gleam").
-export([find_index/3, slice_or_empty/3, drop/2, find_blank_line/2, equals_ascii_ci/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-file("src/multipartkit/internal/bytes.gleam", 29).
?DOC(false).
-spec find_index_loop(bitstring(), bitstring(), integer(), integer(), integer()) -> {ok,
integer()} |
{error, nil}.
find_index_loop(Haystack, Needle, From, Needle_len, Haystack_len) ->
case (From + Needle_len) > Haystack_len of
true ->
{error, nil};
false ->
case gleam_stdlib:bit_array_slice(Haystack, From, Needle_len) of
{ok, Window} ->
case Window =:= Needle of
true ->
{ok, From};
false ->
find_index_loop(
Haystack,
Needle,
From + 1,
Needle_len,
Haystack_len
)
end;
{error, _} ->
{error, nil}
end
end.
-file("src/multipartkit/internal/bytes.gleam", 16).
?DOC(false).
-spec find_index(bitstring(), bitstring(), integer()) -> {ok, integer()} |
{error, nil}.
find_index(Haystack, Needle, From) ->
Needle_len = erlang:byte_size(Needle),
Haystack_len = erlang:byte_size(Haystack),
case Needle_len of
0 ->
{ok, From};
_ ->
find_index_loop(Haystack, Needle, From, Needle_len, Haystack_len)
end.
-file("src/multipartkit/internal/bytes.gleam", 60).
?DOC(false).
-spec slice_or_empty(bitstring(), integer(), integer()) -> bitstring().
slice_or_empty(Buf, At, Length) ->
gleam@result:unwrap(gleam_stdlib:bit_array_slice(Buf, At, Length), <<>>).
-file("src/multipartkit/internal/bytes.gleam", 65).
?DOC(false).
-spec drop(bitstring(), integer()) -> bitstring().
drop(Buf, From) ->
Total = erlang:byte_size(Buf),
case From >= Total of
true ->
<<>>;
false ->
slice_or_empty(Buf, From, Total - From)
end.
-file("src/multipartkit/internal/bytes.gleam", 118).
?DOC(false).
-spec next_line_offset(bitstring(), integer(), integer()) -> {ok, integer()} |
{error, nil}.
next_line_offset(Buf, From, Total) ->
case From >= Total of
true ->
{error, nil};
false ->
case gleam_stdlib:bit_array_slice(Buf, From, 2) of
{ok, <<"\r\n"/utf8>>} ->
{ok, From + 2};
{ok, <<10, _>>} ->
{ok, From + 1};
_ ->
case gleam_stdlib:bit_array_slice(Buf, From, 1) of
{ok, <<10>>} ->
{ok, From + 1};
_ ->
next_line_offset(Buf, From + 1, Total)
end
end
end.
-file("src/multipartkit/internal/bytes.gleam", 94).
?DOC(false).
-spec find_blank_line_loop(bitstring(), integer(), integer()) -> {ok,
{integer(), integer()}} |
{error, nil}.
find_blank_line_loop(Buf, At, Total) ->
case At >= Total of
true ->
{error, nil};
false ->
case gleam_stdlib:bit_array_slice(Buf, At, 2) of
{ok, <<"\r\n"/utf8>>} ->
{ok, {At, At + 2}};
{ok, <<10, _>>} ->
{ok, {At, At + 1}};
_ ->
case gleam_stdlib:bit_array_slice(Buf, At, 1) of
{ok, <<10>>} ->
{ok, {At, At + 1}};
_ ->
case next_line_offset(Buf, At, Total) of
{error, _} ->
{error, nil};
{ok, Next} ->
find_blank_line_loop(Buf, Next, Total)
end
end
end
end.
-file("src/multipartkit/internal/bytes.gleam", 89).
?DOC(false).
-spec find_blank_line(bitstring(), integer()) -> {ok, {integer(), integer()}} |
{error, nil}.
find_blank_line(Buf, From) ->
Total = erlang:byte_size(Buf),
find_blank_line_loop(Buf, From, Total).
-file("src/multipartkit/internal/bytes.gleam", 148).
?DOC(false).
-spec fold_ascii(integer()) -> integer().
fold_ascii(Byte) ->
case (Byte >= 16#41) andalso (Byte =< 16#5A) of
true ->
Byte + 32;
false ->
Byte
end.
-file("src/multipartkit/internal/bytes.gleam", 136).
?DOC(false).
-spec equals_ascii_ci(bitstring(), bitstring()) -> boolean().
equals_ascii_ci(A, B) ->
case {A, B} of
{<<>>, <<>>} ->
true;
{<<X, Ax/binary>>, <<Y, By/binary>>} ->
case fold_ascii(X) =:= fold_ascii(Y) of
true ->
equals_ascii_ci(Ax, By);
false ->
false
end;
{_, _} ->
false
end.