The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "pack.h"
#include "util.h"

void
pack_result_response_nowrap(SV *dest, I32 result,
				 SV *matched_dn, SV *message, SV *referrals) {
    pack_enum(dest, result);
    pack_string_utf8(dest, matched_dn);
    pack_string_utf8(dest, message);
    if (referrals && SvOK(referrals)) {
	STRLEN offset = start_constructed(dest, ASN1_CONTEXT_SPECIFIC|ASN1_CONSTRUCTED, 3);
	pack_array_of_string_utf8(dest, referrals);
	end_constructed(dest, offset);
    }
}

void
pack_result_response_args(SV *dest, U32 op, I32 result,
			       SV *matched_dn, SV *message, SV *referrals) {
    STRLEN offset = start_constructed(dest, ASN1_APPLICATION|ASN1_CONSTRUCTED, op);
    pack_result_response_nowrap(dest, result, matched_dn, message, referrals);
    end_constructed(dest, offset);
}

void
pack_result_response_ref(SV *dest, U32 op, HV *hv) {
    SV *referrals;
    pack_result_response_args(dest, op,
				   SvIV(hv_fetchs_def_undef(hv, "result")),
				   hv_fetchs_def_null(hv, "matched_dn"),
				   hv_fetchs_def_null(hv, "message"),
				   hv_fetchs_def_null(hv, "referrals"));
}