NULL.c 4.78 KB
Newer Older
Lev Walkin's avatar
Lev Walkin committed
1
/*-
Lev Walkin's avatar
Lev Walkin committed
2
 * Copyright (c) 2003, 2005 Lev Walkin <vlm@lionet.info>. All rights reserved.
Lev Walkin's avatar
Lev Walkin committed
3 4
 * Redistribution and modifications are permitted subject to BSD license.
 */
Lev Walkin's avatar
Lev Walkin committed
5
#include <asn_internal.h>
Lev Walkin's avatar
Lev Walkin committed
6
#include <asn_codecs_prim.h>
Lev Walkin's avatar
Lev Walkin committed
7 8 9 10 11 12
#include <NULL.h>
#include <BOOLEAN.h>	/* Implemented in terms of BOOLEAN type */

/*
 * NULL basic type description.
 */
13
static const ber_tlv_tag_t asn_DEF_NULL_tags[] = {
Lev Walkin's avatar
Lev Walkin committed
14 15
	(ASN_TAG_CLASS_UNIVERSAL | (5 << 2))
};
16
asn_TYPE_operation_t asn_OP_NULL = {
Lev Walkin's avatar
Lev Walkin committed
17 18
	BOOLEAN_free,
	NULL_print,
19
	NULL_compare,
Lev Walkin's avatar
Lev Walkin committed
20 21
	BOOLEAN_decode_ber,	/* Implemented in terms of BOOLEAN */
	NULL_encode_der,	/* Special handling of DER encoding */
Lev Walkin's avatar
Lev Walkin committed
22 23
	NULL_decode_xer,
	NULL_encode_xer,
Lev Walkin's avatar
Lev Walkin committed
24 25 26 27
#ifdef	ASN_DISABLE_OER_SUPPORT
	0,
	0,
#else
Lev Walkin's avatar
Lev Walkin committed
28 29
	NULL_decode_oer,
	NULL_encode_oer,
Lev Walkin's avatar
Lev Walkin committed
30
#endif  /* ASN_DISABLE_OER_SUPPORT */
Lev Walkin's avatar
Lev Walkin committed
31 32 33 34 35 36 37
#ifdef	ASN_DISABLE_PER_SUPPORT
	0,
	0,
#else
	NULL_decode_uper,	/* Unaligned PER decoder */
	NULL_encode_uper,	/* Unaligned PER encoder */
#endif	/* ASN_DISABLE_PER_SUPPORT */
38 39 40 41 42 43 44
	0	/* Use generic outmost tag fetcher */
};
asn_TYPE_descriptor_t asn_DEF_NULL = {
	"NULL",
	"NULL",
	&asn_OP_NULL,
	asn_generic_no_constraint,
Lev Walkin's avatar
Lev Walkin committed
45 46 47 48
	asn_DEF_NULL_tags,
	sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
	asn_DEF_NULL_tags,	/* Same as above */
	sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
Lev Walkin's avatar
Lev Walkin committed
49
	0,	/* No OER visible constraints */
Lev Walkin's avatar
Lev Walkin committed
50
	0,	/* No PER visible constraints */
Lev Walkin's avatar
Lev Walkin committed
51
	0, 0,	/* No members */
52
	0	/* No specifics */
Lev Walkin's avatar
Lev Walkin committed
53 54
};

Lev Walkin's avatar
Lev Walkin committed
55
asn_enc_rval_t
Lev Walkin's avatar
Lev Walkin committed
56
NULL_encode_der(asn_TYPE_descriptor_t *td, void *ptr,
Lev Walkin's avatar
Lev Walkin committed
57 58
	int tag_mode, ber_tlv_tag_t tag,
	asn_app_consume_bytes_f *cb, void *app_key) {
Lev Walkin's avatar
Lev Walkin committed
59
	asn_enc_rval_t erval;
Lev Walkin's avatar
Lev Walkin committed
60

61
	erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key);
Lev Walkin's avatar
Lev Walkin committed
62
	if(erval.encoded == -1) {
Lev Walkin's avatar
Lev Walkin committed
63
		erval.failed_type = td;
Lev Walkin's avatar
Lev Walkin committed
64 65 66
		erval.structure_ptr = ptr;
	}

67
	ASN__ENCODED_OK(erval);
Lev Walkin's avatar
Lev Walkin committed
68 69
}

Lev Walkin's avatar
Lev Walkin committed
70
asn_enc_rval_t
Lev Walkin's avatar
Lev Walkin committed
71
NULL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
Lev Walkin's avatar
Lev Walkin committed
72 73 74 75 76 77 78 79 80 81 82 83 84
	int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	asn_enc_rval_t er;

	(void)td;
	(void)sptr;
	(void)ilevel;
	(void)flags;
	(void)cb;
	(void)app_key;

	/* XMLNullValue is empty */
	er.encoded = 0;
85
	ASN__ENCODED_OK(er);
Lev Walkin's avatar
Lev Walkin committed
86 87
}

Lev Walkin's avatar
Lev Walkin committed
88

89 90
static enum xer_pbd_rval
NULL__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) {
Lev Walkin's avatar
Lev Walkin committed
91
	(void)td;
Lev Walkin's avatar
Lev Walkin committed
92
	(void)sptr;
Lev Walkin's avatar
Lev Walkin committed
93
	(void)chunk_buf;    /* Going to be empty according to the rules below. */
94

95 96 97 98
	/*
	 * There must be no content in self-terminating <NULL/> tag.
	 */
	if(chunk_size)
99
		return XPBD_BROKEN_ENCODING;
100 101
	else
		return XPBD_BODY_CONSUMED;
Lev Walkin's avatar
Lev Walkin committed
102 103 104 105 106
}

asn_dec_rval_t
NULL_decode_xer(asn_codec_ctx_t *opt_codec_ctx,
	asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname,
Lev Walkin's avatar
Lev Walkin committed
107
		const void *buf_ptr, size_t size) {
Lev Walkin's avatar
Lev Walkin committed
108 109 110 111 112 113

	return xer_decode_primitive(opt_codec_ctx, td,
		sptr, sizeof(NULL_t), opt_mname, buf_ptr, size,
		NULL__xer_body_decode);
}

114 115 116 117 118 119 120 121
int
NULL_compare(const asn_TYPE_descriptor_t *td, const void *a, const void *b) {
    (void)td;
    (void)a;
    (void)b;
    return 0;
}

Lev Walkin's avatar
Lev Walkin committed
122
int
Lev Walkin's avatar
Lev Walkin committed
123
NULL_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
Lev Walkin's avatar
Lev Walkin committed
124
	asn_app_consume_bytes_f *cb, void *app_key) {
125 126 127 128

	(void)td;	/* Unused argument */
	(void)ilevel;	/* Unused argument */

Lev Walkin's avatar
Lev Walkin committed
129
	if(sptr) {
130
		return (cb("<present>", 9, app_key) < 0) ? -1 : 0;
Lev Walkin's avatar
Lev Walkin committed
131
	} else {
132
		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
Lev Walkin's avatar
Lev Walkin committed
133 134
	}
}
Lev Walkin's avatar
Lev Walkin committed
135

Lev Walkin's avatar
Lev Walkin committed
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
#ifndef ASN_DISABLE_OER_SUPPORT

asn_dec_rval_t
NULL_decode_oer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
                  const asn_oer_constraints_t *constraints, void **struct_ptr,
                  const void *ptr, size_t size) {
    asn_dec_rval_t rv = {RC_OK, 0};
    (void)opt_codec_ctx;
    (void)td;
    (void)constraints;
    (void)struct_ptr;
    (void)ptr;
    (void)size;
    return rv;
}

asn_enc_rval_t
NULL_encode_oer(asn_TYPE_descriptor_t *td,
                const asn_oer_constraints_t *constraints, void *sptr,
                asn_app_consume_bytes_f *cb, void *app_key) {
    asn_enc_rval_t er = {0, td, sptr};

    (void)constraints;
    (void)cb;
    (void)app_key;

    return er;
}

#endif /* ASN_DISABLE_OER_SUPPORT */

#ifndef ASN_DISABLE_PER_SUPPORT

Lev Walkin's avatar
Lev Walkin committed
169 170
asn_dec_rval_t
NULL_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
Lev Walkin's avatar
Lev Walkin committed
171 172 173
                 const asn_per_constraints_t *constraints, void **sptr,
                 asn_per_data_t *pd) {
    asn_dec_rval_t rv;
Lev Walkin's avatar
Lev Walkin committed
174 175 176 177 178 179 180 181 182 183 184

	(void)opt_codec_ctx;
	(void)td;
	(void)constraints;
	(void)pd;

	if(!*sptr) {
		*sptr = MALLOC(sizeof(NULL_t));
		if(*sptr) {
			*(NULL_t *)*sptr = 0;
		} else {
185
			ASN__DECODE_FAILED;
Lev Walkin's avatar
Lev Walkin committed
186 187 188 189 190 191 192 193 194 195 196
		}
	}

	/*
	 * NULL type does not have content octets.
	 */

	rv.code = RC_OK;
	rv.consumed = 0;
	return rv;
}
Lev Walkin's avatar
Lev Walkin committed
197 198

asn_enc_rval_t
Lev Walkin's avatar
Lev Walkin committed
199 200 201 202
NULL_encode_uper(asn_TYPE_descriptor_t *td,
                 const asn_per_constraints_t *constraints, void *sptr,
                 asn_per_outp_t *po) {
    asn_enc_rval_t er;
Lev Walkin's avatar
Lev Walkin committed
203 204 205 206 207 208 209

	(void)td;
	(void)constraints;
	(void)sptr;
	(void)po;

	er.encoded = 0;
210
	ASN__ENCODED_OK(er);
Lev Walkin's avatar
Lev Walkin committed
211
}
Lev Walkin's avatar
Lev Walkin committed
212 213

#endif  /* ASN_DISABLE_PER_SUPPORT */