Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Havar
asn1c
Commits
4b55341c
Commit
4b55341c
authored
Aug 14, 2005
by
Lev Walkin
Browse files
extensions of conditional native-typing to -fbless-SIZE constraints
parent
c3f0b89c
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
ChangeLog
View file @
4b55341c
0.9.18: 2005-Aug-1
3
0.9.18: 2005-Aug-1
4
* The obsolete X.208 syntax is handled gracefully now (compound types'
member names are invented on the fly). (Test case 87).
* Generating enumeration tables for INTEGER types (Test case 88).
* Generating enumeration tables for BIT STRING types (Test case 89).
* Conditional INTEGER/ENUMERATED representation: long vs. INTEGER_t
type is chosen based on PER visible constraints (Test case 90).
type is chosen based on PER visible constraints (Test case
s
90
, 91
).
0.9.17: 2005-Aug-07
...
...
libasn1compiler/asn1c_misc.c
View file @
4b55341c
...
...
@@ -285,12 +285,33 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) {
return
FL_NOTFIT
;
}
if
(
!
expr
->
combined_constraints
)
return
(
arg
->
flags
&
A1C_USE_NATIVE_TYPES
)
?
FL_FORCED
:
FL_NOTFIT
;
/*
* Second, if -fbless-SIZE is given, the (SIZE()) constraint may be
* applied (non-standard! but we can deal with this) to the type.
* Check the range.
*/
range
=
asn1constraint_compute_PER_range
(
expr
->
expr_type
,
expr
->
combined_constraints
,
ACT_CT_SIZE
,
0
,
0
,
CPR_simulate_fbless_SIZE
);
if
(
range
)
{
if
(
!
range
->
incompatible
)
{
right
=
range
->
right
;
/* Use 4 instead of sizeof(long) is justified! */
if
(
right
.
type
==
ARE_VALUE
&&
right
.
value
<=
4
)
return
FL_FITSOK
;
}
asn1constraint_range_free
(
range
);
}
/*
*
Secon
d, pull up the PER visible range of the INTEGER.
*
Thir
d, pull up the PER visible range of the INTEGER.
*/
if
(
expr
->
combined_constraints
)
range
=
asn1constraint_compute_PER_range
(
expr
->
expr_type
,
expr
->
combined_constraints
,
ACT_EL_RANGE
,
0
,
0
,
0
);
range
=
asn1constraint_compute_PER_range
(
expr
->
expr_type
,
expr
->
combined_constraints
,
ACT_EL_RANGE
,
0
,
0
,
0
);
if
(
!
range
||
range
->
empty_constraint
||
range
->
extensible
...
...
libasn1fix/asn1fix.c
View file @
4b55341c
...
...
@@ -414,7 +414,8 @@ asn1f_check_constraints(arg_t *arg) {
range
=
asn1constraint_compute_PER_range
(
etype
,
arg
->
expr
->
combined_constraints
,
test_types
[
i
],
0
,
0
,
0
);
test_types
[
i
],
0
,
0
,
CPR_noflags
/* ignore -fbless-SIZE */
);
if
(
!
range
&&
errno
==
EPERM
)
{
FATAL
(
"This error happened for
\"
%s
\"
(meta %d) "
"at line %d"
,
...
...
libasn1fix/asn1fix_constraint.c
View file @
4b55341c
...
...
@@ -168,15 +168,13 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e ety
if
(
etype
!=
A1TC_INVALID
)
{
ret
=
asn1constraint_compatible
(
etype
,
real_constraint_type
);
ret
=
asn1constraint_compatible
(
etype
,
real_constraint_type
,
arg
->
flags
&
A1F_EXTENDED_SizeConstraint
);
switch
(
ret
)
{
case
-
1
:
/* If unknown, assume OK. */
case
1
:
break
;
case
0
:
if
(
effective_type
==
ACT_CT_SIZE
&&
(
arg
->
flags
&
A1F_EXTENDED_SizeConstraint
))
break
;
default:
FATAL
(
"%s at line %d: "
"Constraint type %s is not applicable to %s"
,
...
...
libasn1fix/asn1fix_constraint_compat.c
View file @
4b55341c
...
...
@@ -7,7 +7,7 @@
*/
int
asn1constraint_compatible
(
asn1p_expr_type_e
expr_type
,
enum
asn1p_constraint_type_e
constr_type
)
{
enum
asn1p_constraint_type_e
constr_type
,
int
fbless_SIZE
)
{
/*
* X.680-0207, Table 9.
...
...
@@ -49,6 +49,11 @@ asn1constraint_compatible(asn1p_expr_type_e expr_type,
return
0
;
case
ACT_CT_SIZE
:
switch
(
expr_type
)
{
case
ASN_BASIC_INTEGER
:
case
ASN_BASIC_ENUMERATED
:
if
(
fbless_SIZE
)
return
1
;
break
;
case
ASN_BASIC_BIT_STRING
:
case
ASN_BASIC_OCTET_STRING
:
case
ASN_BASIC_CHARACTER_STRING
:
...
...
libasn1fix/asn1fix_crange.c
View file @
4b55341c
...
...
@@ -711,7 +711,7 @@ _range_canonicalize(asn1cnst_range_t *range) {
}
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
,
int
strict_PV
)
{
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
)
{
asn1cnst_range_t
*
range
;
asn1cnst_range_t
*
tmp
;
asn1p_value_t
*
vmin
;
...
...
@@ -729,7 +729,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
* Check if the requested constraint is theoretically compatible
* with the given expression type.
*/
if
(
asn1constraint_compatible
(
expr_type
,
type
)
!=
1
)
{
if
(
asn1constraint_compatible
(
expr_type
,
type
,
cpr_flags
&
CPR_simulate_fbless_SIZE
)
!=
1
)
{
errno
=
EINVAL
;
return
0
;
}
...
...
@@ -776,7 +777,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
if
((
expr_type
&
ASN_STRING_NKM_MASK
))
range
->
not_PER_visible
=
1
;
if
(
!
ct
||
(
strict_PV
&&
range
->
not_PER_visible
))
if
(
!
ct
||
(
range
->
not_PER_visible
&&
(
cpr_flags
&
CPR_strict_PER_visibility
)))
return
range
;
switch
(
ct
->
type
)
{
...
...
@@ -809,7 +811,7 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
}
assert
(
ct
->
el_count
==
1
);
tmp
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
->
elements
[
0
],
type
,
minmax
,
exmet
,
strict_PV
);
ct
->
elements
[
0
],
type
,
minmax
,
exmet
,
cpr_flags
);
if
(
tmp
)
{
_range_free
(
range
);
}
else
{
...
...
@@ -830,7 +832,7 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
tmp
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
->
elements
[
i
],
type
,
ct
->
type
==
ACT_CA_SET
?
range
:
minmax
,
exmet
,
strict_PV
);
cpr_flags
);
if
(
!
tmp
)
{
if
(
errno
==
ERANGE
)
{
continue
;
...
...
@@ -851,7 +853,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
continue
;
}
if
(
strict_PV
&&
tmp
->
not_PER_visible
)
{
if
(
tmp
->
not_PER_visible
&&
(
cpr_flags
&
CPR_strict_PER_visibility
))
{
if
(
ct
->
type
==
ACT_CA_SET
)
{
/*
* X.691, #9.3.18:
...
...
@@ -889,7 +892,7 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
for
(
i
=
0
;
i
<
ct
->
el_count
;
i
++
)
{
tmp
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
->
elements
[
i
],
type
,
minmax
,
exmet
,
strict_PV
);
cpr_flags
);
if
(
!
tmp
)
{
if
(
errno
==
ERANGE
)
{
range
->
extensible
=
1
;
...
...
@@ -922,7 +925,7 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
for
(;
i
<
ct
->
el_count
;
i
++
)
{
tmp
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
->
elements
[
i
],
type
,
minmax
,
exmet
,
strict_PV
);
cpr_flags
);
if
(
!
tmp
)
{
if
(
errno
==
ERANGE
)
{
range
->
extensible
=
1
;
...
...
@@ -963,7 +966,8 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
range
->
not_PER_visible
=
1
;
}
if
(
strict_PV
&&
range
->
not_PER_visible
)
{
if
(
range
->
not_PER_visible
&&
(
cpr_flags
&
CPR_strict_PER_visibility
))
{
/*
* X.691, #9.3.19:
* If not PER-visible constraint is part of UNION,
...
...
@@ -987,7 +991,7 @@ asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constr
assert
(
ct
->
el_count
>=
1
);
_range_free
(
range
);
range
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
->
elements
[
0
],
type
,
minmax
,
exmet
,
strict_PV
);
ct
->
elements
[
0
],
type
,
minmax
,
exmet
,
cpr_flags
);
return
range
;
default:
range
->
incompatible
=
1
;
...
...
libasn1fix/asn1fix_crange.h
View file @
4b55341c
...
...
@@ -38,12 +38,17 @@ typedef struct asn1cnst_range_s {
* ENOMEM: Memory allocation failure.
* EPERM: Invalid constraint reference.
*/
enum
cpr_flags
{
CPR_noflags
=
0x00
,
CPR_strict_PER_visibility
=
0x01
,
CPR_simulate_fbless_SIZE
=
0x02
,
};
asn1cnst_range_t
*
asn1constraint_compute_PER_range
(
asn1p_expr_type_e
expr_type
,
const
asn1p_constraint_t
*
ct
,
enum
asn1p_constraint_type_e
required_type
,
const
asn1cnst_range_t
*
minmax
,
int
*
expectation_met
,
int
strict_PER_visibility
);
enum
cpr_flags
);
void
asn1constraint_range_free
(
asn1cnst_range_t
*
);
/*
...
...
@@ -51,7 +56,7 @@ void asn1constraint_range_free(asn1cnst_range_t *);
* with the given expression type.
*/
int
asn1constraint_compatible
(
asn1p_expr_type_e
expr_type
,
enum
asn1p_constraint_type_e
constr_type
);
enum
asn1p_constraint_type_e
constr_type
,
int
fbless_SIZE
);
/*
* Fetch a default alphabet for this type.
...
...
libasn1fix/asn1fix_value.c
View file @
4b55341c
...
...
@@ -80,7 +80,7 @@ asn1f_value_resolve(arg_t *arg, asn1p_expr_t *expr, const enum asn1p_constraint_
*/
if
(
opt_constr_type
)
ret
=
asn1constraint_compatible
(
val_type_expr
->
expr_type
,
*
opt_constr_type
);
*
opt_constr_type
,
0
/* must not matter here */
);
else
ret
=
asn1f_check_type_compatibility
(
arg
,
type_expr
,
val_type_expr
);
...
...
libasn1fix/check_fixer.c
View file @
4b55341c
...
...
@@ -76,15 +76,15 @@ main(int ac, char **av) {
filename
=
dp
->
d_name
;
#endif
/* WIN32 */
len
=
strlen
(
filename
);
if
(
len
&&
strcmp
(
filename
+
len
-
5
,
".asn1"
)
==
0
)
{
ret
=
check
(
filename
,
parser_flags
,
fixer_flags
);
if
(
ret
)
{
fprintf
(
stderr
,
"FAILED: %s
\n
"
,
filename
);
failed
++
;
}
completed
++
;
if
(
len
<=
5
||
strcmp
(
filename
+
len
-
5
,
".asn1"
))
continue
;
ret
=
check
(
filename
,
parser_flags
,
fixer_flags
);
if
(
ret
)
{
fprintf
(
stderr
,
"FAILED: %s
\n
"
,
filename
);
failed
++
;
}
completed
++
;
#ifdef WIN32
}
while
(
_findnext
(
dir
,
&
c_file
)
==
0
);
_findclose
(
dir
);
...
...
@@ -152,6 +152,10 @@ check(const char *fname,
return
-
1
;
}
/* Flag modifiers */
if
(
strstr
(
fname
,
"-blessSize-"
))
fixer_flags
|=
A1F_EXTENDED_SizeConstraint
;
fprintf
(
stderr
,
"[=> %s]
\n
"
,
fname
);
/*
...
...
libasn1print/asn1print.c
View file @
4b55341c
...
...
@@ -445,8 +445,8 @@ asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_
int
as_char
=
(
type
==
ACT_CT_FROM
);
int
i
;
range
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
,
type
,
0
,
0
,
strict_PER_visib
le
);
range
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
,
type
,
0
,
0
,
strict_PER_visible
?
CPR_
strict_PER_visib
ility
:
0
);
if
(
!
range
)
return
-
1
;
if
(
range
->
incompatible
...
...
tests/91-cond-int-blessSize-OK.asn1
0 → 100644
View file @
4b55341c
-- OK: Everything is fine
-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
-- .spelio.software.asn1c.test (9363.1.5.1)
-- .91
ModuleConditionalIntegerType-with-fblessSIZE
{ iso org(3) dod(6) internet (1) private(4) enterprise(1)
spelio(9363) software(1) asn1c(5) test(1) 91 }
DEFINITIONS ::=
BEGIN
OK-Integer1 ::= INTEGER (SIZE(1))
OK-Integer2 ::= INTEGER (SIZE(2))
OK-Integer3 ::= INTEGER (SIZE(3))
OK-Integer4 ::= INTEGER (SIZE(4))
NO-Integer5 ::= INTEGER (SIZE(5))
END
tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE
0 → 100644
View file @
4b55341c
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment