[erlang-patches] ei - decode functions without memory copy
Joseph Norton
norton@REDACTED
Fri Oct 28 16:35:45 CEST 2011
Henrik -
Thank you for your reply. When and if needed, these functions and sample callers for these functions have been uploaded to GitHub:
https://github.com/norton/lets/blob/master/c_src/lets_drv_lib.cc#L412
https://github.com/norton/lets/blob/master/c_src/lets_drv.cc#L545
thanks,
Joseph Norton
norton@REDACTED
On Oct 27, 2011, at 8:46 PM, Henrik Nord wrote:
> On 10/26/2011 02:36 PM, Joseph Wayne Norton wrote:
>> I wanted to ask if there is interest in adding new decode functions to the ei application that do not perform any memory copying.
>>
>> The purpose is to avoid unnecessary memory copy by the ei functions themselves and to avoid unnecessary memory allocation by the decode function callers.
>>
>> Here are two sample implementations - one for atoms and one for binaries.
>>
>> I could prepare an git-based patch if someone can provide some feedback for additional functions that should be included and for a better naming convention for these new functions.
>>
>> thanks,
>>
>> - Joe N.
> Hello
>
> We can not at this time give a definitive answer to this.
> We will have to get back to you at a later date.
> Thank you for the contribution!
>
>
>>
>>
>> // This function inspects an atom from the binary format. The p
>> // parameter is the name of the atom and the name should be
>> // zero-terminated. If the name is equal to the atom in binary
>> // format, returns 0. Otherwise, return -1. If name is NULL, no
>> // comparison is done and returns 0.
>>
>> int
>> ei_inspect_atom(const char *buf, int *index, char *p)
>> {
>> const char *s = buf + *index;
>> const char *s0 = s;
>> int len;
>>
>> if (get8(s) != ERL_ATOM_EXT) return -1;
>>
>> len = get16be(s);
>>
>> if (len> MAXATOMLEN) return -1;
>>
>> if (p) {
>> if (len != (int) strlen(p)) return -1;
>> if (memcmp(p, s, len)) return -1;
>> }
>> s += len;
>> *index += s-s0;
>>
>> return 0;
>> }
>>
>> // This function inspects a binary from the binary format. The p
>> // parameter is set to the address of the binary. The len parameter
>> // is set to the actual size of the binary.
>>
>> int
>> ei_inspect_binary(const char *buf, int *index, void **p, long *lenp)
>> {
>> const char *s = buf + *index;
>> const char *s0 = s;
>> long len;
>>
>> if (get8(s) != ERL_BINARY_EXT) return -1;
>>
>> len = get32be(s);
>> if (p) *p = (void*) s;
>> s += len;
>>
>> if (lenp) *lenp = len;
>> *index += s-s0;
>>
>> return 0;
>> }
>>
>>
>> Joseph Wayne Norton
>> norton@REDACTED
>>
>>
>>
>> Joseph Wayne Norton
>> norton@REDACTED
>>
>>
>>
>> _______________________________________________
>> erlang-patches mailing list
>> erlang-patches@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-patches
>
>
> --
> /Henrik Nord Erlang/OTP
>
More information about the erlang-patches
mailing list