blob: 5c2fad0a68f6dcd58b3fbd8a378ed5bc414286cd [file] [log] [blame]
Lev Walkinb45e0672004-08-18 05:42:05 +00001#ifndef ASN1FIX_CRANGE_H
2#define ASN1FIX_CRANGE_H
3
4typedef struct asn1cnst_edge_s {
5 enum asn1cnst_range_edge {
6 ARE_MIN,
7 ARE_MAX,
8 ARE_VALUE,
9 } type;
10 int lineno; /* Line where the corresponding token was found */
Lev Walkinb8108ec2004-09-29 13:17:17 +000011 asn1c_integer_t value; /* Value when type is ARE_VALUE */
Lev Walkinb45e0672004-08-18 05:42:05 +000012} asn1cnst_edge_t;
13
14typedef struct asn1cnst_range_s {
15 asn1cnst_edge_t left; /* MIN from (MIN..10) */
16 asn1cnst_edge_t right; /* 10 from (MIN..10) */
17
18 /* If range is split in parts, these are the parts */
19 struct asn1cnst_range_s **elements;
20 int el_count;
21 int el_size;
22
23 int empty_constraint; /* If yes, too bad. */
Lev Walkinb74ac572004-08-25 02:05:28 +000024 int extensible; /* Extension marker (...) is in effect. */
Lev Walkinb45e0672004-08-18 05:42:05 +000025
Lev Walkinb74ac572004-08-25 02:05:28 +000026 int incompatible; /* Constraint incompatible with argument */
Lev Walkin98eabc12017-07-19 08:51:11 +040027 int not_OER_visible; /* Contains not OER-visible components */
Lev Walkinb74ac572004-08-25 02:05:28 +000028 int not_PER_visible; /* Contains not PER-visible components */
Lev Walkinb45e0672004-08-18 05:42:05 +000029} asn1cnst_range_t;
30
31/*
Lev Walkin98eabc12017-07-19 08:51:11 +040032 * Compute the constraint range with variable visibility restrictions.
Lev Walkinb45e0672004-08-18 05:42:05 +000033 *
34 * (expr_type) must have the type of the top-level parent ASN.1 type.
35 * (required_type) must be one of ACT_EL_RANGE, ACT_CT_SIZE or ACT_CT_FROM.
36 * (minmax) and (expectation_met) should be 0.
37 * ERRORS:
38 * EINVAL: Mandatory arguments missing.
39 * ENOMEM: Memory allocation failure.
40 * EPERM: Invalid constraint reference.
41 */
Lev Walkin4b553412005-08-14 14:45:44 +000042enum cpr_flags {
43 CPR_noflags = 0x00,
Lev Walkin98eabc12017-07-19 08:51:11 +040044 CPR_strict_OER_visibility = 0x01,
45 CPR_strict_PER_visibility = 0x02,
46 CPR_simulate_fbless_SIZE = 0x04,
Lev Walkin4b553412005-08-14 14:45:44 +000047};
Lev Walkin98eabc12017-07-19 08:51:11 +040048asn1cnst_range_t *asn1constraint_compute_OER_range(asn1p_expr_type_e expr_type,
49 const asn1p_constraint_t *ct,
50 enum asn1p_constraint_type_e required_type,
51 const asn1cnst_range_t *minmax,
52 int *expectation_met,
53 enum cpr_flags);
Lev Walkinb45e0672004-08-18 05:42:05 +000054asn1cnst_range_t *asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type,
55 const asn1p_constraint_t *ct,
56 enum asn1p_constraint_type_e required_type,
57 const asn1cnst_range_t *minmax,
Lev Walkinb74ac572004-08-25 02:05:28 +000058 int *expectation_met,
Lev Walkin4b553412005-08-14 14:45:44 +000059 enum cpr_flags);
Lev Walkin98eabc12017-07-19 08:51:11 +040060/* Base implementation */
61asn1cnst_range_t *asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type,
62 const asn1p_constraint_t *ct,
63 enum asn1p_constraint_type_e required_type,
64 const asn1cnst_range_t *minmax,
65 int *expectation_met,
66 enum cpr_flags);
67
Lev Walkinb45e0672004-08-18 05:42:05 +000068void asn1constraint_range_free(asn1cnst_range_t *);
69
70/*
71 * Check that a specific constraint is compatible
72 * with the given expression type.
73 */
74int asn1constraint_compatible(asn1p_expr_type_e expr_type,
Lev Walkin4b553412005-08-14 14:45:44 +000075 enum asn1p_constraint_type_e constr_type, int fbless_SIZE);
Lev Walkinb45e0672004-08-18 05:42:05 +000076
77/*
78 * Fetch a default alphabet for this type.
79 */
80asn1cnst_range_t *asn1constraint_default_alphabet(asn1p_expr_type_e expr_type);
81
82#endif /* ASN1FIX_CRANGE_H */