From: John Benediktsson Date: Sat, 2 Sep 2023 17:18:57 +0000 (-0700) Subject: leb128: adding LEB128 encoding X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=22e1035fd6cef47ec95144333a1852195dea0138 leb128: adding LEB128 encoding --- diff --git a/extra/leb128/authors.txt b/extra/leb128/authors.txt new file mode 100644 index 0000000000..e091bb8164 --- /dev/null +++ b/extra/leb128/authors.txt @@ -0,0 +1 @@ +John Benediktsson diff --git a/extra/leb128/leb128-tests.factor b/extra/leb128/leb128-tests.factor new file mode 100644 index 0000000000..c9b6d7d8cc --- /dev/null +++ b/extra/leb128/leb128-tests.factor @@ -0,0 +1,8 @@ + +USING: leb128 tools.test ; + +{ B{ 0xe5 0x8e 0x26 } } [ 624485 >leb128 ] unit-test +{ 624485 } [ B{ 0xe5 0x8e 0x26 } leb128> ] unit-test + +{ B{ 0xc0 0xbb 0x78 } } [ -123456 >leb128 ] unit-test +{ -123456 } [ B{ 0xc0 0xbb 0x78 } leb128> ] unit-test diff --git a/extra/leb128/leb128.factor b/extra/leb128/leb128.factor new file mode 100644 index 0000000000..b1381d267d --- /dev/null +++ b/extra/leb128/leb128.factor @@ -0,0 +1,21 @@ +! Copyright (C) 2023 John Benediktsson +! See https://factorcode.org/license.txt for BSD license + +USING: combinators.short-circuit kernel make math sequences ; + +IN: leb128 + +:: >leb128 ( n -- byte-array ) + [ + n [ + [ -7 shift dup ] [ 0x7f bitand ] bi :> ( i b ) + { + [ i zero? b 6 bit? not and ] + [ i -1 = b 6 bit? and ] + } 0|| [ f b ] [ t b 0x80 bitor ] if , + ] loop drop + ] B{ } make ; + +: leb128> ( byte-array -- n ) + [ 0 [ [ 0x7f bitand ] [ 7 * shift ] bi* + ] reduce-index ] keep + dup last 6 bit? [ length 7 * 2^ neg bitor ] [ drop ] if ; diff --git a/extra/leb128/summary.txt b/extra/leb128/summary.txt new file mode 100644 index 0000000000..ad9cdfdfbe --- /dev/null +++ b/extra/leb128/summary.txt @@ -0,0 +1 @@ +LEB128 (Little Endian Base 128) encoding support