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