Fix bits formatting and parsing. (#12)

This commit is contained in:
Erik Stenman 2019-03-01 10:36:17 +01:00 committed by GitHub
parent fccc570bee
commit 20c8fbabc9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 1 deletions

View File

@ -632,7 +632,8 @@ to_bytecode([{'(',_line}|Rest], Address, Env, Code, Opts) ->
Tuple = aeb_fate_data:make_tuple(list_to_tuple(Elements)),
to_bytecode(Rest2, Address, Env, [{immediate, Tuple}|Code], Opts);
to_bytecode([{bits,_line, Bits}|Rest], Address, Env, Code, Opts) ->
to_bytecode(Rest, Address, Env, [{immediate, Bits}|Code], Opts);
to_bytecode(Rest, Address, Env,
[{immediate, aeb_fate_data:make_bits(Bits)}|Code], Opts);
to_bytecode([{comment, Line, Comment}|Rest], Address, Env, Code, Opts) ->
Env2 = insert_annotation(comment, Line, Comment, Env),

View File

@ -137,6 +137,10 @@ format(?FATE_UNIT) -> "()";
format(?FATE_TUPLE(T)) ->
["( ", lists:join(", ", [ format(E) || E <- erlang:tuple_to_list(T)]), " )"];
format(S) when ?IS_FATE_STRING(S) -> [S];
format(?FATE_BITS(B)) when B >= 0 ->
["<", format_bits(B, "") , ">"];
format(?FATE_BITS(B)) when B < 0 ->
["!< ", format_nbits(-B-1, "") , " >"];
format(?FATE_VARIANT(Size, Tag, T)) ->
["(| ",
lists:join("| ", [integer_to_list(Size), integer_to_list(Tag) |
@ -147,6 +151,21 @@ format(M) when ?IS_FATE_MAP(M) ->
format(?FATE_ADDRESS(Address)) -> ["#", address_to_base58(Address)];
format(V) -> exit({not_a_fate_type, V}).
format_bits(0, Acc) -> Acc;
format_bits(N, Acc) ->
case N band 1 of
1 -> format_bits(N bsr 1, [$1|Acc]);
0 -> format_bits(N bsr 1, [$0|Acc])
end.
format_nbits(0, Acc) -> Acc;
format_nbits(N, Acc) ->
case N band 1 of
1 -> format_nbits(N bsr 1, [$0|Acc]);
0 -> format_nbits(N bsr 1, [$1|Acc])
end.
format_list(List) ->
["[ ", lists:join(", ", [format(E) || E <- List]), " ]"].