diff options
author | Lev Walkin <vlm@lionet.info> | 2004-11-16 09:46:00 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-11-16 09:46:00 +0000 |
commit | c4676a80e61c4f52a806efeb35daf955bb4d31eb (patch) | |
tree | 7fc4bb775aeedc804470b802507db1ae1dcce47d /skeletons/der_encoder.c | |
parent | b54577aed861e3d83c9b660847b2d0ff7041d733 (diff) |
der_encode_to_buffer()
Diffstat (limited to 'skeletons/der_encoder.c')
-rw-r--r-- | skeletons/der_encoder.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c index 3523cb12..b2763c7c 100644 --- a/skeletons/der_encoder.c +++ b/skeletons/der_encoder.c @@ -29,6 +29,50 @@ der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, } /* + * Argument type and callback necessary for der_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +/* + * A variant of the der_encode() which encodes the data into the provided buffer + */ +asn_enc_rval_t +der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, + void *buffer, size_t *buffer_size) { + enc_to_buf_arg arg; + asn_enc_rval_t ec; + + arg.buffer = buffer; + arg.left = *buffer_size; + + ec = type_descriptor->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, encode_to_buffer_cb, &arg); + if(ec.encoded != -1) { + assert(ec.encoded == (*buffer_size - arg.left)); + /* Return the encoded contents size */ + *buffer_size = ec.encoded; + } + return ec; +} + + +/* * Write out leading TL[v] sequence according to the type definition. */ ssize_t |