aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons/der_encoder.c
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-11-16 09:46:00 +0000
committerLev Walkin <vlm@lionet.info>2004-11-16 09:46:00 +0000
commitc4676a80e61c4f52a806efeb35daf955bb4d31eb (patch)
tree7fc4bb775aeedc804470b802507db1ae1dcce47d /skeletons/der_encoder.c
parentb54577aed861e3d83c9b660847b2d0ff7041d733 (diff)
der_encode_to_buffer()
Diffstat (limited to 'skeletons/der_encoder.c')
-rw-r--r--skeletons/der_encoder.c44
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