blob: 61eb58fffd6c8f466df3aa263fa21ee0c24d1ed9 [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001/*-
2 * Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
3 * Redistribution and modifications are permitted subject to BSD license.
4 */
vlm39ba4c42004-09-22 16:06:28 +00005#include <asn_internal.h>
vlmfa67ddc2004-06-03 03:38:44 +00006#include <BOOLEAN.h>
7
8/*
9 * BOOLEAN basic type description.
10 */
vlmef6355b2004-09-29 13:26:15 +000011static ber_tlv_tag_t asn_DEF_BOOLEAN_tags[] = {
vlmfa67ddc2004-06-03 03:38:44 +000012 (ASN_TAG_CLASS_UNIVERSAL | (1 << 2))
13};
vlmef6355b2004-09-29 13:26:15 +000014asn_TYPE_descriptor_t asn_DEF_BOOLEAN = {
vlmfa67ddc2004-06-03 03:38:44 +000015 "BOOLEAN",
vlm9de248e2004-10-20 15:50:55 +000016 "BOOLEAN",
vlm39ba4c42004-09-22 16:06:28 +000017 BOOLEAN_free,
18 BOOLEAN_print,
vlmfa67ddc2004-06-03 03:38:44 +000019 asn_generic_no_constraint,
20 BOOLEAN_decode_ber,
21 BOOLEAN_encode_der,
vlm39ba4c42004-09-22 16:06:28 +000022 0, /* Not implemented yet */
23 BOOLEAN_encode_xer,
vlmfa67ddc2004-06-03 03:38:44 +000024 0, /* Use generic outmost tag fetcher */
vlmef6355b2004-09-29 13:26:15 +000025 asn_DEF_BOOLEAN_tags,
26 sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]),
27 asn_DEF_BOOLEAN_tags, /* Same as above */
28 sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]),
vlme413c122004-08-20 13:23:42 +000029 0, 0, /* No members */
vlmb42843a2004-06-05 08:17:50 +000030 0 /* No specifics */
vlmfa67ddc2004-06-03 03:38:44 +000031};
32
33/*
34 * Decode BOOLEAN type.
35 */
vlm9de248e2004-10-20 15:50:55 +000036asn_dec_rval_t
vlmef6355b2004-09-29 13:26:15 +000037BOOLEAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
38 asn_TYPE_descriptor_t *td,
vlmaf9cf132004-08-19 13:26:36 +000039 void **bool_value, void *buf_ptr, size_t size,
vlmfa67ddc2004-06-03 03:38:44 +000040 int tag_mode) {
vlmaf9cf132004-08-19 13:26:36 +000041 BOOLEAN_t *st = (BOOLEAN_t *)*bool_value;
vlm9de248e2004-10-20 15:50:55 +000042 asn_dec_rval_t rval;
vlmfa67ddc2004-06-03 03:38:44 +000043 ber_tlv_len_t length;
44 ber_tlv_len_t lidx;
45
46 if(st == NULL) {
vlm6678cb12004-09-26 13:10:40 +000047 st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st)));
vlmfa67ddc2004-06-03 03:38:44 +000048 if(st == NULL) {
49 rval.code = RC_FAIL;
50 rval.consumed = 0;
51 return rval;
52 }
53 }
54
55 ASN_DEBUG("Decoding %s as BOOLEAN (tm=%d)",
56 td->name, tag_mode);
57
58 /*
59 * Check tags.
60 */
vlmef6355b2004-09-29 13:26:15 +000061 rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size,
62 tag_mode, 0, &length, 0);
vlmfa67ddc2004-06-03 03:38:44 +000063 if(rval.code != RC_OK)
64 return rval;
65
66 ASN_DEBUG("Boolean length is %d bytes", (int)length);
67
vlmd86c9252004-08-25 01:34:11 +000068 buf_ptr = ((char *)buf_ptr) + rval.consumed;
vlmfa67ddc2004-06-03 03:38:44 +000069 size -= rval.consumed;
vlmb42843a2004-06-05 08:17:50 +000070 if(length > (ber_tlv_len_t)size) {
vlmfa67ddc2004-06-03 03:38:44 +000071 rval.code = RC_WMORE;
72 rval.consumed = 0;
73 return rval;
74 }
75
76 /*
77 * Compute boolean value.
78 */
vlmaf9cf132004-08-19 13:26:36 +000079 for(*st = 0, lidx = 0;
80 (lidx < length) && *st == 0; lidx++) {
vlmfa67ddc2004-06-03 03:38:44 +000081 /*
82 * Very simple approach: read bytes until the end or
83 * value is already TRUE.
84 * BOOLEAN is not supposed to contain meaningful data anyway.
85 */
vlmaf9cf132004-08-19 13:26:36 +000086 *st |= ((uint8_t *)buf_ptr)[lidx];
vlmfa67ddc2004-06-03 03:38:44 +000087 }
88
89 rval.code = RC_OK;
90 rval.consumed += length;
91
vlmaf9cf132004-08-19 13:26:36 +000092 ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d",
vlmfa67ddc2004-06-03 03:38:44 +000093 (long)rval.consumed, (long)length,
vlmaf9cf132004-08-19 13:26:36 +000094 td->name, *st);
vlmfa67ddc2004-06-03 03:38:44 +000095
96 return rval;
97}
98
vlm39ba4c42004-09-22 16:06:28 +000099asn_enc_rval_t
vlmef6355b2004-09-29 13:26:15 +0000100BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
vlmfa67ddc2004-06-03 03:38:44 +0000101 int tag_mode, ber_tlv_tag_t tag,
102 asn_app_consume_bytes_f *cb, void *app_key) {
vlm39ba4c42004-09-22 16:06:28 +0000103 asn_enc_rval_t erval;
vlmda674682004-08-11 09:07:36 +0000104 BOOLEAN_t *st = (BOOLEAN_t *)sptr;
vlmfa67ddc2004-06-03 03:38:44 +0000105
vlm6678cb12004-09-26 13:10:40 +0000106 erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key);
vlmfa67ddc2004-06-03 03:38:44 +0000107 if(erval.encoded == -1) {
108 erval.failed_type = td;
109 erval.structure_ptr = sptr;
110 return erval;
111 }
112
113 if(cb) {
114 uint8_t bool_value;
vlmfa67ddc2004-06-03 03:38:44 +0000115
vlm6678cb12004-09-26 13:10:40 +0000116 bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */
117
118 if(cb(&bool_value, 1, app_key) < 0) {
vlmfa67ddc2004-06-03 03:38:44 +0000119 erval.encoded = -1;
120 erval.failed_type = td;
121 erval.structure_ptr = sptr;
122 return erval;
123 }
124 }
125
126 erval.encoded += 1;
127
128 return erval;
129}
130
vlm39ba4c42004-09-22 16:06:28 +0000131asn_enc_rval_t
vlmef6355b2004-09-29 13:26:15 +0000132BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
vlm39ba4c42004-09-22 16:06:28 +0000133 int ilevel, enum xer_encoder_flags_e flags,
134 asn_app_consume_bytes_f *cb, void *app_key) {
135 const BOOLEAN_t *st = (const BOOLEAN_t *)sptr;
136 asn_enc_rval_t er;
137
138 (void)ilevel;
139 (void)flags;
140
141 if(!st) _ASN_ENCODE_FAILED;
142
143 if(*st) {
144 _ASN_CALLBACK("<true/>", 7);
145 er.encoded = 7;
146 } else {
147 _ASN_CALLBACK("<false/>", 8);
148 er.encoded = 8;
149 }
150
151 return er;
vlm84d551b2004-10-03 09:13:02 +0000152cb_failed:
153 _ASN_ENCODE_FAILED;
vlm39ba4c42004-09-22 16:06:28 +0000154}
155
vlmfa67ddc2004-06-03 03:38:44 +0000156int
vlmef6355b2004-09-29 13:26:15 +0000157BOOLEAN_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
vlmfa67ddc2004-06-03 03:38:44 +0000158 asn_app_consume_bytes_f *cb, void *app_key) {
vlmda674682004-08-11 09:07:36 +0000159 const BOOLEAN_t *st = (const BOOLEAN_t *)sptr;
vlm6678cb12004-09-26 13:10:40 +0000160 const char *buf;
161 size_t buflen;
vlmfa67ddc2004-06-03 03:38:44 +0000162
vlmb42843a2004-06-05 08:17:50 +0000163 (void)td; /* Unused argument */
164 (void)ilevel; /* Unused argument */
165
vlmfa67ddc2004-06-03 03:38:44 +0000166 if(st) {
vlm6678cb12004-09-26 13:10:40 +0000167 if(*st) {
168 buf = "TRUE";
169 buflen = 4;
170 } else {
171 buf = "FALSE";
172 buflen = 5;
173 }
vlmfa67ddc2004-06-03 03:38:44 +0000174 } else {
vlm6678cb12004-09-26 13:10:40 +0000175 buf = "<absent>";
176 buflen = 8;
vlmfa67ddc2004-06-03 03:38:44 +0000177 }
vlm6678cb12004-09-26 13:10:40 +0000178
179 return (cb(buf, buflen, app_key) < 0) ? -1 : 0;
vlmfa67ddc2004-06-03 03:38:44 +0000180}
181
182void
vlmef6355b2004-09-29 13:26:15 +0000183BOOLEAN_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
vlmfa67ddc2004-06-03 03:38:44 +0000184 if(td && ptr && !contents_only) {
185 FREEMEM(ptr);
186 }
187}
188