Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
asn1c
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
asn1c
Commits
4b55341c
Commit
4b55341c
authored
Aug 14, 2005
by
Lev Walkin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
extensions of conditional native-typing to -fbless-SIZE constraints
parent
c3f0b89c
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
753 additions
and
35 deletions
+753
-35
ChangeLog
ChangeLog
+2
-2
libasn1compiler/asn1c_misc.c
libasn1compiler/asn1c_misc.c
+25
-4
libasn1fix/asn1fix.c
libasn1fix/asn1fix.c
+2
-1
libasn1fix/asn1fix_constraint.c
libasn1fix/asn1fix_constraint.c
+2
-4
libasn1fix/asn1fix_constraint_compat.c
libasn1fix/asn1fix_constraint_compat.c
+6
-1
libasn1fix/asn1fix_crange.c
libasn1fix/asn1fix_crange.c
+14
-10
libasn1fix/asn1fix_crange.h
libasn1fix/asn1fix_crange.h
+7
-2
libasn1fix/asn1fix_value.c
libasn1fix/asn1fix_value.c
+1
-1
libasn1fix/check_fixer.c
libasn1fix/check_fixer.c
+12
-8
libasn1print/asn1print.c
libasn1print/asn1print.c
+2
-2
tests/91-cond-int-blessSize-OK.asn1
tests/91-cond-int-blessSize-OK.asn1
+20
-0
tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE
tests/91-cond-int-blessSize-OK.asn1.-Pfbless-SIZE
+660
-0
No files found.
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_visible
);
range
=
asn1constraint_compute_PER_range
(
expr_type
,
ct
,
type
,
0
,
0
,
strict_PER_visible
?
CPR_strict_PER_visibility
:
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