Commit a28cbb9f authored by Lev Walkin's avatar Lev Walkin

add constraint debug

parent fc4f37a5
...@@ -2151,7 +2151,8 @@ emit_member_OER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { ...@@ -2151,7 +2151,8 @@ emit_member_OER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) {
INDENT(+1); INDENT(+1);
range = asn1constraint_compute_OER_range(etype, expr->combined_constraints, range = asn1constraint_compute_OER_range(expr->Identifier, etype,
expr->combined_constraints,
ACT_EL_RANGE, 0, 0, 0); ACT_EL_RANGE, 0, 0, 0);
if(emit_single_member_OER_constraint(arg, range, 0)) { if(emit_single_member_OER_constraint(arg, range, 0)) {
return -1; return -1;
...@@ -2160,7 +2161,8 @@ emit_member_OER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { ...@@ -2160,7 +2161,8 @@ emit_member_OER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) {
OUT(",\n"); OUT(",\n");
range = asn1constraint_compute_OER_range(etype, expr->combined_constraints, range = asn1constraint_compute_OER_range(expr->Identifier, etype,
expr->combined_constraints,
ACT_CT_SIZE, 0, 0, 0); ACT_CT_SIZE, 0, 0, 0);
if(emit_single_member_OER_constraint(arg, range, "SIZE")) { if(emit_single_member_OER_constraint(arg, range, "SIZE")) {
return -1; return -1;
...@@ -2233,7 +2235,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { ...@@ -2233,7 +2235,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) {
if(emit_single_member_PER_constraint(arg, &tmprng, 0, 0)) if(emit_single_member_PER_constraint(arg, &tmprng, 0, 0))
return -1; return -1;
} else if(etype & ASN_STRING_KM_MASK) { } else if(etype & ASN_STRING_KM_MASK) {
range = asn1constraint_compute_PER_range(etype, range = asn1constraint_compute_PER_range(expr->Identifier, etype,
expr->combined_constraints, ACT_CT_FROM, expr->combined_constraints, ACT_CT_FROM,
0, 0, 0); 0, 0, 0);
DEBUG("Emitting FROM constraint for %s", expr->Identifier); DEBUG("Emitting FROM constraint for %s", expr->Identifier);
...@@ -2263,7 +2265,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { ...@@ -2263,7 +2265,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) {
avoid: avoid:
asn1constraint_range_free(range); asn1constraint_range_free(range);
} else { } else {
range = asn1constraint_compute_PER_range(etype, range = asn1constraint_compute_PER_range(expr->Identifier, etype,
expr->combined_constraints, ACT_EL_RANGE, expr->combined_constraints, ACT_EL_RANGE,
0, 0, 0); 0, 0, 0);
if(emit_single_member_PER_constraint(arg, range, 0, 0)) if(emit_single_member_PER_constraint(arg, range, 0, 0))
...@@ -2272,7 +2274,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { ...@@ -2272,7 +2274,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) {
} }
OUT(",\n"); OUT(",\n");
range = asn1constraint_compute_PER_range(etype, range = asn1constraint_compute_PER_range(expr->Identifier, etype,
expr->combined_constraints, ACT_CT_SIZE, 0, 0, 0); expr->combined_constraints, ACT_CT_SIZE, 0, 0, 0);
if(emit_single_member_PER_constraint(arg, range, 0, "SIZE")) if(emit_single_member_PER_constraint(arg, range, 0, "SIZE"))
return -1; return -1;
......
...@@ -43,8 +43,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { ...@@ -43,8 +43,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) {
etype = _find_terminal_type(arg); etype = _find_terminal_type(arg);
r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); r_value=asn1constraint_compute_constraint_range(expr->Identifier, etype, ct, ACT_EL_RANGE,0,0,0);
r_size =asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE, 0,0,0); r_size =asn1constraint_compute_constraint_range(expr->Identifier, etype, ct, ACT_CT_SIZE, 0,0,0);
if(r_value) { if(r_value) {
if(r_value->incompatible if(r_value->incompatible
|| r_value->empty_constraint || r_value->empty_constraint
...@@ -251,7 +251,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { ...@@ -251,7 +251,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) {
etype = _find_terminal_type(arg); etype = _find_terminal_type(arg);
range = asn1constraint_compute_PER_range(etype, ct, ACT_CT_FROM, 0,0,0); range = asn1constraint_compute_constraint_range(arg->expr->Identifier, etype, ct, ACT_CT_FROM, 0,0,0);
if(!range) return 0; if(!range) return 0;
if(range->incompatible if(range->incompatible
......
...@@ -359,7 +359,8 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { ...@@ -359,7 +359,8 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) {
* applied (non-standard! but we can deal with this) to the type. * applied (non-standard! but we can deal with this) to the type.
* Check the range. * Check the range.
*/ */
range = asn1constraint_compute_PER_range(expr->expr_type, range = asn1constraint_compute_constraint_range(expr->Identifier,
expr->expr_type,
expr->combined_constraints, ACT_CT_SIZE, 0, 0, expr->combined_constraints, ACT_CT_SIZE, 0, 0,
CPR_simulate_fbless_SIZE); CPR_simulate_fbless_SIZE);
if(range) { if(range) {
...@@ -375,7 +376,7 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { ...@@ -375,7 +376,7 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) {
/* /*
* Third, pull up the PER visible range of the INTEGER. * Third, pull up the PER visible range of the INTEGER.
*/ */
range = asn1constraint_compute_PER_range(expr->expr_type, range = asn1constraint_compute_PER_range(expr->Identifier, expr->expr_type,
expr->combined_constraints, ACT_EL_RANGE, 0, 0, 0); expr->combined_constraints, ACT_EL_RANGE, 0, 0, 0);
if(!range if(!range
......
...@@ -448,7 +448,8 @@ asn1f_check_constraints(arg_t *arg) { ...@@ -448,7 +448,8 @@ asn1f_check_constraints(arg_t *arg) {
RET2RVAL(ret, rvalue); RET2RVAL(ret, rvalue);
for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) { for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) {
range = asn1constraint_compute_PER_range( range = asn1constraint_compute_constraint_range(
arg->expr->Identifier,
etype, etype,
arg->expr->combined_constraints, arg->expr->combined_constraints,
test_types[i], 0, 0, test_types[i], 0, 0,
......
...@@ -699,17 +699,21 @@ _range_canonicalize(asn1cnst_range_t *range) { ...@@ -699,17 +699,21 @@ _range_canonicalize(asn1cnst_range_t *range) {
} }
asn1cnst_range_t * asn1cnst_range_t *
asn1constraint_compute_OER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { asn1constraint_compute_OER_range(const char *dbg_name, asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e requested_ct_type
return asn1constraint_compute_constraint_range(expr_type, ct, type, minmax, exmet, cpr_flags); , const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) {
return asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, requested_ct_type, minmax, exmet, cpr_flags | CPR_strict_OER_visibility);
} }
asn1cnst_range_t * asn1cnst_range_t *
asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { asn1constraint_compute_PER_range(const char *dbg_name, asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e requested_ct_type
return asn1constraint_compute_constraint_range(expr_type, ct, type, minmax, exmet, cpr_flags); , const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) {
if(0) return asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, requested_ct_type, minmax, exmet, cpr_flags | CPR_strict_PER_visibility);
/* Due to pecularities of PER constraint handling, we don't enable strict PER visibility upfront here. */
return asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, requested_ct_type, minmax, exmet, cpr_flags);
} }
asn1cnst_range_t * asn1cnst_range_t *
asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { asn1constraint_compute_constraint_range(const char *dbg_name, asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) {
asn1cnst_range_t *range; asn1cnst_range_t *range;
asn1cnst_range_t *tmp; asn1cnst_range_t *tmp;
asn1p_value_t *vmin; asn1p_value_t *vmin;
...@@ -824,7 +828,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p ...@@ -824,7 +828,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p
return range; return range;
} }
assert(ct->el_count == 1); assert(ct->el_count == 1);
tmp = asn1constraint_compute_constraint_range(expr_type, tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type,
ct->elements[0], type, minmax, exmet, cpr_flags); ct->elements[0], type, minmax, exmet, cpr_flags);
if(tmp) { if(tmp) {
_range_free(range); _range_free(range);
...@@ -843,7 +847,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p ...@@ -843,7 +847,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p
/* AND constraints, one after another. */ /* AND constraints, one after another. */
for(i = 0; i < ct->el_count; i++) { for(i = 0; i < ct->el_count; i++) {
tmp = asn1constraint_compute_constraint_range(expr_type, tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type,
ct->elements[i], type, ct->elements[i], type,
ct->type==ACT_CA_SET?range:minmax, exmet, ct->type==ACT_CA_SET?range:minmax, exmet,
cpr_flags); cpr_flags);
...@@ -913,7 +917,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p ...@@ -913,7 +917,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p
*/ */
tmp = 0; tmp = 0;
for(i = 0; i < ct->el_count; i++) { for(i = 0; i < ct->el_count; i++) {
tmp = asn1constraint_compute_constraint_range(expr_type, tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type,
ct->elements[i], type, minmax, exmet, ct->elements[i], type, minmax, exmet,
cpr_flags); cpr_flags);
if(!tmp) { if(!tmp) {
...@@ -946,7 +950,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p ...@@ -946,7 +950,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p
* Canonicalizator will do the union magic. * Canonicalizator will do the union magic.
*/ */
for(; i < ct->el_count; i++) { for(; i < ct->el_count; i++) {
tmp = asn1constraint_compute_constraint_range(expr_type, tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type,
ct->elements[i], type, minmax, exmet, ct->elements[i], type, minmax, exmet,
cpr_flags); cpr_flags);
if(!tmp) { if(!tmp) {
...@@ -1021,7 +1025,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p ...@@ -1021,7 +1025,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p
*/ */
assert(ct->el_count >= 1); assert(ct->el_count >= 1);
_range_free(range); _range_free(range);
range = asn1constraint_compute_constraint_range(expr_type, range = asn1constraint_compute_constraint_range(dbg_name, expr_type,
ct->elements[0], type, minmax, exmet, cpr_flags); ct->elements[0], type, minmax, exmet, cpr_flags);
return range; return range;
default: default:
......
...@@ -45,20 +45,23 @@ enum cpr_flags { ...@@ -45,20 +45,23 @@ enum cpr_flags {
CPR_strict_PER_visibility = 0x02, CPR_strict_PER_visibility = 0x02,
CPR_simulate_fbless_SIZE = 0x04, CPR_simulate_fbless_SIZE = 0x04,
}; };
asn1cnst_range_t *asn1constraint_compute_OER_range(asn1p_expr_type_e expr_type, asn1cnst_range_t *asn1constraint_compute_OER_range(const char *dbg_name,
asn1p_expr_type_e expr_type,
const asn1p_constraint_t *ct, const asn1p_constraint_t *ct,
enum asn1p_constraint_type_e required_type, enum asn1p_constraint_type_e required_type,
const asn1cnst_range_t *minmax, const asn1cnst_range_t *minmax,
int *expectation_met, int *expectation_met,
enum cpr_flags); enum cpr_flags);
asn1cnst_range_t *asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, asn1cnst_range_t *asn1constraint_compute_PER_range(const char *dbg_name,
asn1p_expr_type_e expr_type,
const asn1p_constraint_t *ct, const asn1p_constraint_t *ct,
enum asn1p_constraint_type_e required_type, enum asn1p_constraint_type_e required_type,
const asn1cnst_range_t *minmax, const asn1cnst_range_t *minmax,
int *expectation_met, int *expectation_met,
enum cpr_flags); enum cpr_flags);
/* Base implementation */ /* Base implementation */
asn1cnst_range_t *asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, asn1cnst_range_t *asn1constraint_compute_constraint_range(const char *dbg_name,
asn1p_expr_type_e expr_type,
const asn1p_constraint_t *ct, const asn1p_constraint_t *ct,
enum asn1p_constraint_type_e required_type, enum asn1p_constraint_type_e required_type,
const asn1cnst_range_t *minmax, const asn1cnst_range_t *minmax,
......
...@@ -483,12 +483,12 @@ asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) { ...@@ -483,12 +483,12 @@ asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) {
} }
static int static int
asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, enum cpr_flags cpr) { asn1print_constraint_explain_type(const char *dbg_name, asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, enum cpr_flags cpr) {
asn1cnst_range_t *range; asn1cnst_range_t *range;
int as_char = (type==ACT_CT_FROM); int as_char = (type==ACT_CT_FROM);
int i; int i;
range = asn1constraint_compute_constraint_range(expr_type, ct, type, 0, 0, cpr); range = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, type, 0, 0, cpr);
if(!range) return -1; if(!range) return -1;
if(range->incompatible) return 0; if(range->incompatible) return 0;
...@@ -538,14 +538,14 @@ asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_ ...@@ -538,14 +538,14 @@ asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_
} }
static int static int
asn1print_constraint_explain(asn1p_expr_type_e expr_type, asn1print_constraint_explain(const char *dbg_name, asn1p_expr_type_e expr_type,
asn1p_constraint_t *ct, enum cpr_flags cpr) { asn1p_constraint_t *ct, enum cpr_flags cpr) {
asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE, cpr); asn1print_constraint_explain_type(dbg_name, expr_type, ct, ACT_EL_RANGE, cpr);
safe_printf(" "); safe_printf(" ");
asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE, cpr); asn1print_constraint_explain_type(dbg_name, expr_type, ct, ACT_CT_SIZE, cpr);
safe_printf(" "); safe_printf(" ");
asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM, cpr); asn1print_constraint_explain_type(dbg_name, expr_type, ct, ACT_CT_FROM, cpr);
return 0; return 0;
} }
...@@ -758,15 +758,18 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri ...@@ -758,15 +758,18 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri
if(top_parent) { if(top_parent) {
safe_printf("\n-- Practical constraints (%s): ", safe_printf("\n-- Practical constraints (%s): ",
top_parent->Identifier); top_parent->Identifier);
asn1print_constraint_explain(top_parent->expr_type, asn1print_constraint_explain(top_parent->Identifier,
top_parent->expr_type,
tc->combined_constraints, 0); tc->combined_constraints, 0);
safe_printf("\n-- OER-visible constraints (%s): ", safe_printf("\n-- OER-visible constraints (%s): ",
top_parent->Identifier); top_parent->Identifier);
asn1print_constraint_explain(top_parent->expr_type, asn1print_constraint_explain(top_parent->Identifier,
top_parent->expr_type,
tc->combined_constraints, CPR_strict_OER_visibility); tc->combined_constraints, CPR_strict_OER_visibility);
safe_printf("\n-- PER-visible constraints (%s): ", safe_printf("\n-- PER-visible constraints (%s): ",
top_parent->Identifier); top_parent->Identifier);
asn1print_constraint_explain(top_parent->expr_type, asn1print_constraint_explain(top_parent->Identifier,
top_parent->expr_type,
tc->combined_constraints, CPR_strict_PER_visibility); tc->combined_constraints, CPR_strict_PER_visibility);
} }
safe_printf("\n"); safe_printf("\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment