Current section

Files

Jump to
string_width src string_width_ffi.erl
Raw

src/string_width_ffi.erl

-module(string_width_ffi).
-export([
ansi_re/0,
ascii_re/0,
scan_poslen/2,
fold_codepoints/3,
utf_codepoint_to_string/1
]).
-on_load(load/0).
load() ->
{ok, AnsiRe} = re:compile("[\x1B\x9B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\x07|\x1B\x5C|\x9C))|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))", [multiline]),
ok = persistent_term:put({?MODULE, ansi_re}, AnsiRe),
{ok, AsciiRe} = re:compile("[\x20-\x7e]+", []),
ok = persistent_term:put({?MODULE, ascii_re}, AsciiRe),
ok.
ansi_re() ->
persistent_term:get({?MODULE, ansi_re}).
ascii_re() ->
persistent_term:get({?MODULE, ascii_re}).
scan_poslen(Re, Str) ->
case re:run(Str, Re, [global]) of
nomatch -> [];
{match, Matches} -> [Match || [Match] <- Matches]
end.
fold_codepoints(Binary, State, Fun) ->
case Binary of
<<Cp/utf8, Rest/binary>> -> fold_codepoints(Rest, Fun(State, Cp), Fun);
_ -> State
end.
utf_codepoint_to_string(Cp) ->
<<Cp/utf8>>.