aboutsummaryrefslogtreecommitdiffstats
path: root/lib/erl_interface/src/encode/encode_binary.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2019-04-17 19:09:57 +0200
committerSverker Eriksson <[email protected]>2019-04-17 19:09:57 +0200
commit236cb4b5eb3b89c837324a5ae7a11117d671d717 (patch)
tree41a090786155ab22d5c7a883c275c59d059a4ea0 /lib/erl_interface/src/encode/encode_binary.c
parentdbe9bbfb801bcd92cc54c73ce96203b3a04c5517 (diff)
parent6a0deeae54ee18aa2028e994c33d633bb41021ed (diff)
downloadotp-236cb4b5eb3b89c837324a5ae7a11117d671d717.tar.gz
otp-236cb4b5eb3b89c837324a5ae7a11117d671d717.tar.bz2
otp-236cb4b5eb3b89c837324a5ae7a11117d671d717.zip
Merge branch 'sverker/bit-binary-ext/OTP-15712'
* sverker/bit-binary-ext/OTP-15712: jinterface: Add dist flag for export funs erl_interface: Add bitstring and export fun support erl_interface: Remove old r9 pid and port compatibility erl_interface: Refactor ei_decode_SUITE erl_interface: Fix maps arity from ei_get_type() erl_interface: Remove ei_get_type_internal() erl_interface: Deprecate ei_encode_term and ei_decode_term
Diffstat (limited to 'lib/erl_interface/src/encode/encode_binary.c')
-rw-r--r--lib/erl_interface/src/encode/encode_binary.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/erl_interface/src/encode/encode_binary.c b/lib/erl_interface/src/encode/encode_binary.c
index 4471c51769..4aa9f6bc16 100644
--- a/lib/erl_interface/src/encode/encode_binary.c
+++ b/lib/erl_interface/src/encode/encode_binary.c
@@ -40,3 +40,27 @@ int ei_encode_binary(char *buf, int *index, const void *p, long len)
return 0;
}
+int ei_encode_bitstring(char *buf, int *index, const void *p, size_t bits)
+{
+ char *s = buf + *index;
+ char *s0 = s;
+ size_t bytes = (bits + 7) / 8;
+ char last_bits = bits % 8;
+
+ if (bytes == 0 || last_bits == 0)
+ return ei_encode_binary(buf, index, p, bytes);
+
+ if (!buf) s += 6;
+ else {
+ put8(s, ERL_BIT_BINARY_EXT);
+ put32be(s, bytes);
+ put8(s, last_bits);
+ memcpy(s, p, bytes);
+ s[bytes-1] &= (0xff << (8-last_bits));
+ }
+ s += bytes;
+
+ *index += s-s0;
+
+ return 0;
+}