=pod

=head1 NAME

OSSL_ENCODER_to_data,
OSSL_ENCODER_to_bio,
OSSL_ENCODER_to_fp
- Routines to perform an encoding

=head1 SYNOPSIS

 #include <openssl/encoder.h>

 int OSSL_ENCODER_to_data(OSSL_ENCODER_CTX *ctx, unsigned char **pdata,
                          size_t *pdata_len);
 int OSSL_ENCODER_to_bio(OSSL_ENCODER_CTX *ctx, BIO *out);
 int OSSL_ENCODER_to_fp(OSSL_ENCODER_CTX *ctx, FILE *fp);

Feature availability macros:

=over 4

=item OSSL_ENCODER_to_fp() is only available when B<OPENSSL_NO_STDIO>
is undefined.

=back

=head1 DESCRIPTION

OSSL_ENCODER_to_data() runs the encoding process for the context I<ctx>,
with the output going to the I<*pdata> and I<*pdata_len>.
If I<*pdata> is NULL when OSSL_ENCODER_to_data() is called, a buffer will be
allocated using L<OPENSSL_zalloc(3)>, and I<*pdata> will be set to point at
the start of that buffer, and I<*pdata_len> will be assigned its length when
OSSL_ENCODER_to_data() returns.
If I<*pdata> is non-NULL when OSSL_ENCODER_to_data() is called, I<*pdata_len>
is assumed to have its size.  In this case, I<*pdata> will be set to point
after the encoded bytes, and I<*pdata_len> will be assigned the number of
remaining bytes.

OSSL_ENCODER_to_bio() runs the encoding process for the context I<ctx>, with
the output going to the B<BIO> I<out>.

OSSL_ENCODER_to_fp() does the same thing as OSSL_ENCODER_to_bio(), except
that the output is going to the B<FILE> I<fp>.

=for comment Know your encoder!

For OSSL_ENCODER_to_bio() and OSSL_ENCODER_to_fp(), the application is
required to set up the B<BIO> or B<FILE> properly, for example to have
it in text or binary mode as is appropriate for the encoder output type.

=head1 RETURN VALUES

OSSL_ENCODER_to_bio(), OSSL_ENCODER_to_fp() and OSSL_ENCODER_to_data()
return 1 on success, or 0 on failure.

=begin comment TODO(3.0) Add examples!

=head1 EXAMPLES

Text, because pod2xxx doesn't like empty sections

=end comment

=head1 SEE ALSO

L<provider(7)>, L<OSSL_ENCODER_CTX(3)>

=head1 HISTORY

The functions described here were added in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
