blob: 4e12c898c225517aa080024526f86af50dc921c0 [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001/*
2 * A collection of data members of unspecified types.
3 */
4#ifndef ASN1_PARSER_EXPR_H
5#define ASN1_PARSER_EXPR_H
6
7/*
8 * Meta type of the ASN expression.
9 */
10typedef enum asn1p_expr_meta {
11 AMT_INVALID,
12 AMT_TYPE, /* Type1 ::= INTEGER */
13 AMT_TYPEREF, /* Type2 ::= Type1 */
vlmfa67ddc2004-06-03 03:38:44 +000014 AMT_VALUE, /* value1 Type1 ::= 1 */
15 AMT_VALUESET, /* ValueSet Type1 ::= { value1 } */
vlmdc7cf042006-03-09 08:49:26 +000016 AMT_OBJECT, /* object CLASS ::= {...} */
17 AMT_OBJECTCLASS, /* FUNCTION ::= CLASS {...} */
vlmfa67ddc2004-06-03 03:38:44 +000018 AMT_OBJECTFIELD, /* ... */
19 AMT_EXPR_META_MAX
20} asn1p_expr_meta_e;
21
22/*
23 * ASN type of the expression.
24 */
25typedef enum asn1p_expr_type {
26 /*
27 * Internal types.
28 */
29 A1TC_INVALID, /* Invalid type */
30 A1TC_REFERENCE, /* Reference to the type defined elsewhere */
31 A1TC_EXPORTVAR, /* We're exporting this definition */
32 A1TC_UNIVERVAL, /* A value of an ENUMERATED, INTEGER or BS */
vlmfa67ddc2004-06-03 03:38:44 +000033 A1TC_BITVECTOR, /* A plain collection of bits */
34 A1TC_OPAQUE, /* Opaque data encoded as a bitvector */
35 A1TC_EXTENSIBLE, /* An extension marker "..." */
vlmec8f6812004-08-22 03:19:54 +000036 A1TC_COMPONENTS_OF, /* COMPONENTS OF clause */
vlmfa67ddc2004-06-03 03:38:44 +000037 A1TC_VALUESET, /* Value set definition */
38 A1TC_CLASSDEF, /* Information Object Class */
vlmfa67ddc2004-06-03 03:38:44 +000039 A1TC_INSTANCE, /* Instance of Object Class */
vlmdc7cf042006-03-09 08:49:26 +000040
41 /*
42 * ASN.1 Class field types
43 */
44#define ASN_CLASSFIELD_MASK 0x10 /* Every class field type */
45 A1TC_CLASSFIELD_TFS = ASN_CLASSFIELD_MASK, /* TypeFieldSpec */
46 A1TC_CLASSFIELD_FTVFS, /* FixedTypeValueFieldSpec */
47 A1TC_CLASSFIELD_VTVFS, /* VariableTypeValueFieldSpec */
48 A1TC_CLASSFIELD_FTVSFS, /* FixedTypeValueSetFieldSpec */
49 A1TC_CLASSFIELD_VTVSFS, /* VariableTypeValueSetFieldSpec */
50 A1TC_CLASSFIELD_OFS, /* ObjectFieldSpec */
51 A1TC_CLASSFIELD_OSFS, /* ObjectSetFieldSpec */
vlmec8f6812004-08-22 03:19:54 +000052
vlmfa67ddc2004-06-03 03:38:44 +000053 /*
54 * ASN.1 Constructed types
55 */
vlmdc7cf042006-03-09 08:49:26 +000056#define ASN_CONSTR_MASK 0x20 /* Every constructed type */
vlmfa67ddc2004-06-03 03:38:44 +000057 ASN_CONSTR_SEQUENCE = ASN_CONSTR_MASK, /* SEQUENCE */
58 ASN_CONSTR_CHOICE, /* CHOICE */
59 ASN_CONSTR_SET, /* SET */
60 ASN_CONSTR_SEQUENCE_OF, /* SEQUENCE OF */
61 ASN_CONSTR_SET_OF, /* SET OF */
vlm3ddcc1c2004-08-25 01:58:59 +000062
vlmfa67ddc2004-06-03 03:38:44 +000063 /*
64 * ASN.1 Basic types
65 */
vlmdc7cf042006-03-09 08:49:26 +000066#define ASN_BASIC_MASK 0x40 /* Every basic type */
vlm044f7442004-09-04 04:49:21 +000067 ASN_TYPE_ANY = ASN_BASIC_MASK, /* ANY (deprecated) */
68 ASN_BASIC_BOOLEAN,
vlmfa67ddc2004-06-03 03:38:44 +000069 ASN_BASIC_NULL,
70 ASN_BASIC_INTEGER,
71 ASN_BASIC_REAL,
72 ASN_BASIC_ENUMERATED,
73 ASN_BASIC_BIT_STRING,
74 ASN_BASIC_OCTET_STRING,
75 ASN_BASIC_OBJECT_IDENTIFIER,
76 ASN_BASIC_RELATIVE_OID,
77 ASN_BASIC_EXTERNAL,
78 ASN_BASIC_EMBEDDED_PDV,
79 ASN_BASIC_CHARACTER_STRING,
80 ASN_BASIC_UTCTime,
81 ASN_BASIC_GeneralizedTime,
vlmec8f6812004-08-22 03:19:54 +000082
vlmfa67ddc2004-06-03 03:38:44 +000083 /*
84 * ASN.1 String types
85 */
vlmdc7cf042006-03-09 08:49:26 +000086#define ASN_STRING_KM_MASK 0x100 /* Known multiplier */
87#define ASN_STRING_NKM_MASK 0x200 /* Not a known multiplier */
88#define ASN_STRING_MASK 0x300 /* Every restricted string type */
vlm3ddcc1c2004-08-25 01:58:59 +000089 ASN_STRING_IA5String = ASN_STRING_KM_MASK,
90 ASN_STRING_PrintableString,
91 ASN_STRING_VisibleString,
92 ASN_STRING_ISO646String, /* aka VisibleString */
93 ASN_STRING_NumericString,
94 ASN_STRING_UniversalString,
95 ASN_STRING_BMPString,
96 ASN_STRING_UTF8String = ASN_STRING_NKM_MASK,
vlmfa67ddc2004-06-03 03:38:44 +000097 ASN_STRING_GeneralString,
98 ASN_STRING_GraphicString,
vlmfa67ddc2004-06-03 03:38:44 +000099 ASN_STRING_TeletexString,
100 ASN_STRING_T61String,
vlmfa67ddc2004-06-03 03:38:44 +0000101 ASN_STRING_VideotexString,
vlmfa67ddc2004-06-03 03:38:44 +0000102 ASN_STRING_ObjectDescriptor,
103 ASN_EXPR_TYPE_MAX
104} asn1p_expr_type_e;
105
106#include "asn1p_expr_str.h"
107#include "asn1p_expr2uclass.h"
108
vlmec8f6812004-08-22 03:19:54 +0000109struct asn1p_module_s; /* Forward declaration */
110
vlmfa67ddc2004-06-03 03:38:44 +0000111/*
112 * A named collection of types.
113 */
114typedef struct asn1p_expr_s {
115
116 /*
117 * Human readable name.
118 */
119 char *Identifier;
120
121 /*
122 * Meta type of the expression (type, value, value set, etc).
123 */
124 asn1p_expr_meta_e meta_type;
125
126 /*
127 * ASN type of the expression.
128 */
129 asn1p_expr_type_e expr_type;
130
131 /*
vlm4053ca52005-02-18 16:34:21 +0000132 * Referenced type, defined elsewhere.
vlmfa67ddc2004-06-03 03:38:44 +0000133 * (If expr_type == A1TC_REFERENCE)
134 */
135 asn1p_ref_t *reference;
136
137 /*
138 * Constraints for the type.
139 */
140 asn1p_constraint_t *constraints;
141
142 /*
vlm9283dbe2004-08-18 04:59:12 +0000143 * This field is holding the transformed constraints, with all the
144 * parent constraints taken into account.
145 */
146 asn1p_constraint_t *combined_constraints;
147
148 /*
vlm0c6d3812006-03-21 03:40:38 +0000149 * Left hand side parameters for parametrized type declaration
150 * Type{Param1, Param2} ::= SEQUENCE { a Param1, b Param2 }
vlmfa67ddc2004-06-03 03:38:44 +0000151 */
vlm0c6d3812006-03-21 03:40:38 +0000152 asn1p_paramlist_t *lhs_params;
153 /*
154 * Right hand type specialization.
155 * Type2 ::= Type{Param1}
156 */
157 struct asn1p_expr_s *rhs_pspecs; /* ->members */
158 /*
159 * If lhs_params is defined, this structure represents all possible
160 * specializations of the parent expression.
161 */
162 struct {
163 struct asn1p_pspec_s {
164 struct asn1p_expr_s *rhs_pspecs;
165 struct asn1p_expr_s *my_clone;
166 } *pspec;
167 int pspecs_count; /* Number of specializations */
168 } specializations;
169 int spec_index; /* -1, or 0-based specialization index in the parent */
vlmfa67ddc2004-06-03 03:38:44 +0000170
171 /*
172 * The actual value (DefinedValue or inlined value).
173 */
174 asn1p_value_t *value;
175
176 /*
vlm2ec1e232005-06-02 17:40:32 +0000177 * The WITH SYNTAX clause.
vlmfa67ddc2004-06-03 03:38:44 +0000178 */
179 asn1p_wsyntx_t *with_syntax;
180
vlma6a84d72006-03-16 10:03:35 +0000181 /* Information Object Class matrix, specific for this class */
182 struct asn1p_ioc_matrix_s {
183 asn1p_ioc_row_t **row;
184 int rows;
185 int max_identifier_length;
186 } object_class_matrix;
187
vlmfa67ddc2004-06-03 03:38:44 +0000188 /*
189 * A tag.
190 */
191 struct asn1p_type_tag_s {
192 enum {
193 TC_NOCLASS,
194 TC_UNIVERSAL,
195 TC_APPLICATION,
196 TC_CONTEXT_SPECIFIC,
197 TC_PRIVATE,
198 } tag_class;
199 enum {
200 TM_DEFAULT,
201 TM_IMPLICIT,
202 TM_EXPLICIT,
203 } tag_mode;
vlmec6acd42004-09-29 13:18:09 +0000204 asn1c_integer_t tag_value;
vlmfa67ddc2004-06-03 03:38:44 +0000205 } tag;
206
vlm6ac9b0d2004-09-15 11:59:30 +0000207 struct asn1p_expr_marker_s {
208 enum asn1p_expr_marker_e {
vlm6c4a8502005-08-18 13:38:19 +0000209 EM_NOMARK,
210 EM_INDIRECT = 0x01, /* 00001 Represent as pointer */
vlm1ac75e72005-11-26 11:21:55 +0000211 EM_OMITABLE = 0x02, /* 00010 May be absent in encoding */
vlm6c4a8502005-08-18 13:38:19 +0000212 EM_OPTIONAL = 0x07, /* 00111 Optional member */
213 EM_DEFAULT = 0x0F, /* 01111 default_value */
214 EM_UNRECURSE = 0x10, /* 10000 Use safe naming */
vlm6ac9b0d2004-09-15 11:59:30 +0000215 } flags;
216 asn1p_value_t *default_value; /* For EM_DEFAULT case */
vlmd82eb012004-09-10 08:21:27 +0000217 } marker;
218 int unique; /* UNIQUE */
219
vlmfa67ddc2004-06-03 03:38:44 +0000220 /*
vlm766cf1e2005-03-04 08:48:53 +0000221 * Whether automatic tagging may be applied for subtypes.
vlmfa67ddc2004-06-03 03:38:44 +0000222 */
223 int auto_tags_OK;
224
vlmfa67ddc2004-06-03 03:38:44 +0000225 /*
226 * Members of the constructed type.
227 */
228 TQ_HEAD(struct asn1p_expr_s) members;
229
230 /*
231 * Next expression in the list.
232 */
233 TQ_ENTRY(struct asn1p_expr_s) next;
234
vlm6a02a8a2004-09-08 00:28:11 +0000235 struct asn1p_expr_s *parent_expr; /* optional */
236
237 struct asn1p_module_s *module; /* Defined in module */
238
vlmfa67ddc2004-06-03 03:38:44 +0000239 /*
240 * Line number where this structure is defined in the original
241 * grammar source.
242 */
243 int _lineno;
vlmec8f6812004-08-22 03:19:54 +0000244
vlmfa67ddc2004-06-03 03:38:44 +0000245 /*
246 * Marks are used for various purposes.
247 * Here are some predefined ones.
248 */
249 enum {
vlm86380d32006-10-09 12:07:58 +0000250 TM_NOMARK = 0,
251 TM_RECURSION = (1<<0), /* Used to break recursion */
252 TM_BROKEN = (1<<1), /* A warning was already issued */
253 TM_PERFROMCT = (1<<2), /* PER FROM() constraint tables emitted */
vlmfa67ddc2004-06-03 03:38:44 +0000254 } _mark;
255
vlm766cf1e2005-03-04 08:48:53 +0000256 /*
257 * Some tags used by the compiler.
258 */
259 int _anonymous_type; /* This type is unnamed */
260 int _type_unique_index; /* A per top-level-type unique index */
vlm1ac75e72005-11-26 11:21:55 +0000261 int _type_referenced; /* This type is referenced from another place */
vlmec8f6812004-08-22 03:19:54 +0000262
vlmfa67ddc2004-06-03 03:38:44 +0000263 /*
264 * Opaque data may be attached to this structure,
265 * probably by compiler.
266 */
267 void *data;
268 void (*data_free)(void *data);
269} asn1p_expr_t;
270
271
272/*
273 * Constructor and destructor.
274 */
vlm43c8ac52006-09-17 04:52:50 +0000275asn1p_expr_t *asn1p_expr_new(int _lineno, struct asn1p_module_s *);
vlmec8f6812004-08-22 03:19:54 +0000276asn1p_expr_t *asn1p_expr_clone(asn1p_expr_t *, int skip_extensions);
vlm0c6d3812006-03-21 03:40:38 +0000277asn1p_expr_t *asn1p_expr_clone_with_resolver(asn1p_expr_t *,
278 asn1p_expr_t *(*resolver)(asn1p_expr_t *to_resolve, void *resolver_arg),
279 void *resolver_arg);
vlm6a02a8a2004-09-08 00:28:11 +0000280void asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what);
vlmfa67ddc2004-06-03 03:38:44 +0000281void asn1p_expr_free(asn1p_expr_t *expr);
282
vlm5b103032005-06-02 05:21:53 +0000283#define TAG2STRING_BUFFER_SIZE 64 /* buf should be at least this big */
284char *asn1p_tag2string(struct asn1p_type_tag_s *tag, char *opt_buf);
285
vlmfa67ddc2004-06-03 03:38:44 +0000286#endif /* ASN1_PARSER_EXPR_H */