diff options
author | Sverker Eriksson <[email protected]> | 2019-04-17 19:09:57 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2019-04-17 19:09:57 +0200 |
commit | 236cb4b5eb3b89c837324a5ae7a11117d671d717 (patch) | |
tree | 41a090786155ab22d5c7a883c275c59d059a4ea0 /lib/erl_interface/src/decode/decode_binary.c | |
parent | dbe9bbfb801bcd92cc54c73ce96203b3a04c5517 (diff) | |
parent | 6a0deeae54ee18aa2028e994c33d633bb41021ed (diff) | |
download | otp-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/decode/decode_binary.c')
-rw-r--r-- | lib/erl_interface/src/decode/decode_binary.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/erl_interface/src/decode/decode_binary.c b/lib/erl_interface/src/decode/decode_binary.c index 5b8d234984..2799438bef 100644 --- a/lib/erl_interface/src/decode/decode_binary.c +++ b/lib/erl_interface/src/decode/decode_binary.c @@ -40,4 +40,40 @@ int ei_decode_binary(const char *buf, int *index, void *p, long *lenp) return 0; } +int ei_decode_bitstring(const char *buf, int *index, void *p, size_t plen, + size_t *bitsp) +{ + const char *s = buf + *index; + const char *s0 = s; + unsigned long len; + unsigned char last_bits; + const unsigned char tag = get8(s); + + if (tag == ERL_BINARY_EXT) { + long bytes; + int ret = ei_decode_binary(buf, index, p, &bytes); + if (bitsp) + *bitsp = (size_t)bytes * 8; + return ret; + } + + if (tag != ERL_BIT_BINARY_EXT) + return -1; + + len = get32be(s); + last_bits = get8(s); + + if (len > plen || ((last_bits==0) != (len==0)) || last_bits > 8) + return -1; + + if (p) + memcpy(p, s, len); + s += len; + + if (bitsp) + *bitsp = (len == 0) ? 0 : ((len-1) * 8) + last_bits; + + *index += s-s0; + return 0; +} |