blob: 2351628d39e71ba415155fa322d87d7483b29f88 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001/*
2 * Type constraints.
3 */
4#ifndef ASN1_PARSER_CONSTRAINT_H
5#define ASN1_PARSER_CONSTRAINT_H
6
7typedef struct asn1p_constraint_s {
8
9 enum asn1p_constraint_type_e {
10 ACT_INVALID, /* for assertions */
11 /*
12 * Constraint elements.
13 */
Lev Walkinff7dd142005-03-20 12:58:00 +000014 ACT_EL_TYPE, /* T (contained subtype) */
15 ACT_EL_VALUE, /* 123, "A", (elementary value) */
Lev Walkinf15320b2004-06-03 03:38:44 +000016 ACT_EL_RANGE, /* 1..2 (elementary range) */
17 ACT_EL_LLRANGE, /* 1<..2 (elementary range) */
18 ACT_EL_RLRANGE, /* 1..<2 (elementary range) */
19 ACT_EL_ULRANGE, /* 1<..<2 (elementary range) */
20 ACT_EL_EXT, /* ... (extensibility mark) */
21 /*
22 * Constraint types.
23 */
24 ACT_CT_SIZE, /* SIZE constraint type */
25 ACT_CT_FROM, /* FROM constraint type */
26 ACT_CT_WCOMP, /* WITH COMPONENT */
27 ACT_CT_WCOMPS, /* WITH COMPONENTS */
Lev Walkin1893ddf2005-03-20 14:28:32 +000028 ACT_CT_CTDBY, /* CONSTRAINED BY */
Lev Walkina9532f42006-09-17 04:52:50 +000029 ACT_CT_CTNG, /* CONTAINING Type */
Lev Walkin5c541f12006-10-18 18:40:14 +000030 ACT_CT_PATTERN, /* PATTERN Value */
Lev Walkinf15320b2004-06-03 03:38:44 +000031 /*
32 * Arrays of constraints.
33 */
34 ACT_CA_SET, /* A set of constraints: (c1)(c2) */
Lev Walkina9532f42006-09-17 04:52:50 +000035 ACT_CA_CRC, /* Comp. relation c-t: ({a}{@b}) */
Lev Walkinf15320b2004-06-03 03:38:44 +000036 ACT_CA_CSV, /* Comma-separated constraints array */
37 ACT_CA_UNI, /* UNION (|) */
38 ACT_CA_INT, /* INTERSECTION (^) */
39 ACT_CA_EXC, /* EXCEPT */
Lev Walkin1e448d32005-03-24 14:26:38 +000040 ACT_CA_AEX, /* ALL EXCEPT */
Lev Walkinf15320b2004-06-03 03:38:44 +000041 } type;
42
43 enum asn1p_constr_pres_e {
44 ACPRES_DEFAULT,
45 ACPRES_PRESENT,
46 ACPRES_ABSENT,
47 ACPRES_OPTIONAL,
48 } presence;
49
Bi-Ruei, Chiu80fd3062017-05-07 21:00:51 +080050 struct asn1p_constraint_s *parent_ct; /* optional */
51
Lev Walkinf15320b2004-06-03 03:38:44 +000052 /*
Lev Walkinff7dd142005-03-20 12:58:00 +000053 * Separate types and values.
Lev Walkinf15320b2004-06-03 03:38:44 +000054 */
Lev Walkinff7dd142005-03-20 12:58:00 +000055 asn1p_value_t *containedSubtype;
Lev Walkinf15320b2004-06-03 03:38:44 +000056 asn1p_value_t *value;
57 asn1p_value_t *range_start;
58 asn1p_value_t *range_stop;
59
60 /*
61 * A collection of constraint elements.
62 */
63 struct asn1p_constraint_s **elements;
Lev Walkine972d932004-09-05 10:40:28 +000064 unsigned int el_count; /* Number of meaningful elements */
65 unsigned int el_size; /* Size of the allocated (elements) */
Lev Walkinf15320b2004-06-03 03:38:44 +000066
Bi-Ruei, Chiu80fd3062017-05-07 21:00:51 +080067 struct asn1p_module_s *module; /* Defined in module */
Lev Walkinf15320b2004-06-03 03:38:44 +000068 int _lineno; /* Position in a source file */
69} asn1p_constraint_t;
70
Lev Walkinf59d0752004-08-18 04:59:12 +000071/* Human-readable constraint type description */
Lev Walkinfc4f37a2017-07-31 19:57:45 -070072const char *asn1p_constraint_type2str(enum asn1p_constraint_type_e);
Lev Walkinf15320b2004-06-03 03:38:44 +000073
Lev Walkinea6635b2017-08-06 23:23:04 -070074const asn1p_constraint_t *asn1p_get_component_relation_constraint(
75 asn1p_constraint_t *);
76
77int asn1p_constraint_compare(const asn1p_constraint_t *,
78 const asn1p_constraint_t *);
79void asn1p_constraint_set_source(asn1p_constraint_t *,
80 struct asn1p_module_s *module, int lineno);
81
Lev Walkinf15320b2004-06-03 03:38:44 +000082/*
83 * Constructors and a recursive destructor.
84 */
Bi-Ruei, Chiu80fd3062017-05-07 21:00:51 +080085asn1p_constraint_t *asn1p_constraint_new(int _lineno, asn1p_module_t *mod);
Lev Walkinf15320b2004-06-03 03:38:44 +000086void asn1p_constraint_free(asn1p_constraint_t *);
87
88/*
89 * Clone the constraint and all its children.
90 */
91asn1p_constraint_t *asn1p_constraint_clone(asn1p_constraint_t *source_to_clone);
Lev Walkina00d6b32006-03-21 03:40:38 +000092asn1p_constraint_t *asn1p_constraint_clone_with_resolver(
93 asn1p_constraint_t *source_to_clone,
94 asn1p_value_t *(*resolver)(asn1p_value_t *, void *), void *);
Lev Walkinf15320b2004-06-03 03:38:44 +000095
96/*
97 * Insert additional element into the element array of a (to) constraint.
98 */
99int asn1p_constraint_insert(asn1p_constraint_t *into, asn1p_constraint_t *what);
Lev Walkina00d6b32006-03-21 03:40:38 +0000100int asn1p_constraint_prepend(asn1p_constraint_t *before, asn1p_constraint_t *what);
Lev Walkinf15320b2004-06-03 03:38:44 +0000101
102#endif /* ASN1_PARSER_CONSTRAINT_H */