1 /*- 2 * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved. 3 * Redistribution and modifications are permitted subject to BSD license. 4 */ 5 #ifndef _CONSTR_SET_H_ 6 #define _CONSTR_SET_H_ 7 8 #include <asn_application.h> 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 15 typedef struct asn_SET_specifics_s { 16 /* 17 * Target structure description. 18 */ 19 int struct_size; /* Size of the target structure. */ 20 int ctx_offset; /* Offset of the asn_struct_ctx_t member */ 21 int pres_offset; /* Offset of _presence_map member */ 22 23 /* 24 * Tags to members mapping table (sorted). 25 * Sometimes suitable for DER encoding (untagged CHOICE is present); 26 * if so, tag2el_count will be greater than td->elements_count. 27 */ 28 asn_TYPE_tag2member_t *tag2el; 29 int tag2el_count; 30 31 /* 32 * Tags to members mapping table, second edition. 33 * Suitable for CANONICAL-XER encoding. 34 */ 35 asn_TYPE_tag2member_t *tag2el_cxer; 36 int tag2el_cxer_count; 37 38 /* 39 * Extensions-related stuff. 40 */ 41 int extensible; /* Whether SET is extensible */ 42 unsigned int *_mandatory_elements; /* Bitmask of mandatory ones */ 43 } asn_SET_specifics_t; 44 45 /* 46 * A set specialized functions dealing with the SET type. 47 */ 48 asn_struct_free_f SET_free; 49 asn_struct_print_f SET_print; 50 asn_constr_check_f SET_constraint; 51 ber_type_decoder_f SET_decode_ber; 52 der_type_encoder_f SET_encode_der; 53 xer_type_decoder_f SET_decode_xer; 54 xer_type_encoder_f SET_encode_xer; 55 per_type_decoder_f SET_decode_uper; 56 per_type_encoder_f SET_encode_uper; 57 58 /*********************** 59 * Some handy helpers. * 60 ***********************/ 61 62 /* 63 * Figure out whether the SET member indicated by PR_x has already been decoded. 64 * It is very simple bitfield test, despite its visual complexity. 65 */ 66 #define ASN_SET_ISPRESENT(set_ptr, PR_x) \ 67 ASN_SET_ISPRESENT2(&((set_ptr)->_presence_map), PR_x) 68 #define ASN_SET_ISPRESENT2(map_ptr, PR_x) \ 69 (((unsigned int *)(map_ptr)) \ 70 [(PR_x) / (8 * sizeof(unsigned int))] \ 71 & (1 << ((8 * sizeof(unsigned int)) - 1 \ 72 - ((PR_x) % (8 * sizeof(unsigned int)))))) 73 74 #define ASN_SET_MKPRESENT(map_ptr, PR_x) \ 75 (((unsigned int *)(map_ptr)) \ 76 [(PR_x) / (8 * sizeof(unsigned int))] \ 77 |= (1 << ((8 * sizeof(unsigned int)) - 1 \ 78 - ((PR_x) % (8 * sizeof(unsigned int)))))) 79 80 #ifdef __cplusplus 81 } 82 #endif 83 84 #endif /* _CONSTR_SET_H_ */ 85