blob: a539508e242f8c203194ea07cdc2399b091b48e4 [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 Walkina28cbb92017-07-31 20:20:17 -070048asn1cnst_range_t *asn1constraint_compute_OER_range(const char *dbg_name,
49 asn1p_expr_type_e expr_type,
Lev Walkin98eabc12017-07-19 08:51:11 +040050 const asn1p_constraint_t *ct,
51 enum asn1p_constraint_type_e required_type,
52 const asn1cnst_range_t *minmax,
53 int *expectation_met,
54 enum cpr_flags);
Lev Walkina28cbb92017-07-31 20:20:17 -070055asn1cnst_range_t *asn1constraint_compute_PER_range(const char *dbg_name,
56 asn1p_expr_type_e expr_type,
Lev Walkinb45e0672004-08-18 05:42:05 +000057 const asn1p_constraint_t *ct,
58 enum asn1p_constraint_type_e required_type,
59 const asn1cnst_range_t *minmax,
Lev Walkinb74ac572004-08-25 02:05:28 +000060 int *expectation_met,
Lev Walkin4b553412005-08-14 14:45:44 +000061 enum cpr_flags);
Lev Walkin98eabc12017-07-19 08:51:11 +040062/* Base implementation */
Lev Walkina28cbb92017-07-31 20:20:17 -070063asn1cnst_range_t *asn1constraint_compute_constraint_range(const char *dbg_name,
64 asn1p_expr_type_e expr_type,
Lev Walkin98eabc12017-07-19 08:51:11 +040065 const asn1p_constraint_t *ct,
66 enum asn1p_constraint_type_e required_type,
67 const asn1cnst_range_t *minmax,
68 int *expectation_met,
69 enum cpr_flags);
70
Lev Walkinb45e0672004-08-18 05:42:05 +000071void asn1constraint_range_free(asn1cnst_range_t *);
72
73/*
74 * Check that a specific constraint is compatible
75 * with the given expression type.
76 */
77int asn1constraint_compatible(asn1p_expr_type_e expr_type,
Lev Walkin4b553412005-08-14 14:45:44 +000078 enum asn1p_constraint_type_e constr_type, int fbless_SIZE);
Lev Walkinb45e0672004-08-18 05:42:05 +000079
80/*
81 * Fetch a default alphabet for this type.
82 */
83asn1cnst_range_t *asn1constraint_default_alphabet(asn1p_expr_type_e expr_type);
84
85#endif /* ASN1FIX_CRANGE_H */