compiler directives support; TMF 040-1 compatible

git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@982 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
vlm 2005-09-05 05:17:57 +00:00
parent e0fea71cb9
commit 177a5b6fec
9 changed files with 2558 additions and 3192 deletions

View File

@ -1,12 +1,12 @@
0.9.19: 2005-Aug-18 0.9.19: 2005-Sep-04
* A proper solution to circular references. No kludge flags * A proper solution to circular references. No kludge flags
should be necessary anymore to produce reference-free code: should be necessary anymore to produce reference-free code:
recursive dependencies are resolved automatically. recursive dependencies are resolved automatically.
* Test cases 73 & 92 keep track of various circular references. * Test cases 73 & 92 keep track of various circular references.
* Introduced asn1c-specific modifier to allow finer control over the * Introduced compiler directives to allow finer control over the
generated code ("<asn1c:pointer>" in comments), (Test case 93). generated code ("--<ASN1C...>--" in comments), (Test case 93).
0.9.18: 2005-Aug-14 0.9.18: 2005-Aug-14

File diff suppressed because it is too large Load Diff

View File

@ -97,32 +97,22 @@ WSP [\t\r\v\f\n ]
-{3,} yy_pop_state(); /* Acceptable end of comment */ -{3,} yy_pop_state(); /* Acceptable end of comment */
} }
--<[ \t]*ASN1C.RepresentAsPointer[ \t]*>-- asn1p_as_pointer = 1;
-- yy_push_state(dash_comment); -- yy_push_state(dash_comment);
<dash_comment,idash_comment>{ <dash_comment,idash_comment>{
{NL} yy_pop_state(); {NL} yy_pop_state();
"<asn1c:"[^\r\v\f\n>-]{1,80}">" {
if(strcmp(yytext, "<asn1c:pointer>") == 0)
asn1p_as_pointer = 1;
/* Eat modifier */
}
"<" /* Eat stand-alone left angle brace */
-- yy_pop_state(); /* End of comment */ -- yy_pop_state(); /* End of comment */
- /* Eat single dash */ - /* Eat single dash */
[^\r\v\f\n<-]+ /* Eat */ [^\r\v\f\n-]+ /* Eat */
} }
<INITIAL,cpp_comment>"/*" yy_push_state(cpp_comment); <INITIAL,cpp_comment>"/*" yy_push_state(cpp_comment);
<cpp_comment>{ <cpp_comment>{
[^*/<] /* Eat */ [^*/<] /* Eat */
"*/" yy_pop_state(); "*/" yy_pop_state();
"<asn1c:"[^\r\v\f\n>-]{1,80}">" {
if(strcmp(yytext, "<asn1c:pointer>") == 0)
asn1p_as_pointer = 1;
/* Eat modifier */
}
. /* Eat */ . /* Eat */
} }

File diff suppressed because it is too large Load Diff

View File

@ -24,11 +24,9 @@ void asn1p_lexer_hack_push_encoding_control(void);
extern int asn1p_lineno; extern int asn1p_lineno;
/* /*
* Process modifiers as <asn1c:pointer> * Process directives as <ASN1C:RepresentAsPointer>
*/ */
extern int asn1p_as_pointer; extern int asn1p_as_pointer;
static asn1p_expr_t *asn1p_last_type;
static void apply_nonstd_mods(void);
/* /*
* This temporary variable is used to solve the shortcomings of 1-lookahead * This temporary variable is used to solve the shortcomings of 1-lookahead
@ -313,6 +311,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
%type <a_int> optUnique %type <a_int> optUnique
%type <a_pres> optPresenceConstraint PresenceConstraint %type <a_pres> optPresenceConstraint PresenceConstraint
%type <tv_str> ComponentIdList %type <tv_str> ComponentIdList
%type <a_int> NSTD_IndirectMarker
%% %%
@ -897,8 +896,15 @@ ComponentType:
$$ = $2; $$ = $2;
assert($$->Identifier == 0); assert($$->Identifier == 0);
$$->Identifier = $1; $$->Identifier = $1;
$3.flags |= $$->marker.flags;
$$->marker = $3; $$->marker = $3;
} }
| Type optMarker {
$$ = $1;
$2.flags |= $$->marker.flags;
$$->marker = $2;
_fixup_anonymous_identifier($$);
}
| TOK_COMPONENTS TOK_OF Type { | TOK_COMPONENTS TOK_OF Type {
$$ = asn1p_expr_new(yylineno); $$ = asn1p_expr_new(yylineno);
checkmem($$); checkmem($$);
@ -909,11 +915,6 @@ ComponentType:
| ExtensionAndException { | ExtensionAndException {
$$ = $1; $$ = $1;
} }
| Type optMarker {
$$ = $1;
$$->marker = $2;
_fixup_anonymous_identifier($$);
}
; ;
AlternativeTypeLists: AlternativeTypeLists:
@ -1094,32 +1095,52 @@ Type:
$$->constraints = $3; $$->constraints = $3;
} }
} }
asn1p_last_type = $$; }
;
NSTD_IndirectMarker:
{
$$ = asn1p_as_pointer ? EM_INDIRECT : 0;
asn1p_as_pointer = 0;
} }
; ;
TypeDeclaration: TypeDeclaration:
{apply_nonstd_mods();} TypeDeclarationSet { NSTD_IndirectMarker TypeDeclarationSet {
$$ = $2; $$ = $2;
$$->marker.flags |= $1;
if(($$->marker.flags & EM_INDIRECT)
&& ($$->marker.flags & EM_OPTIONAL) != EM_OPTIONAL) {
fprintf(stderr,
"INFO: Directive <ASN1C:RepresentAsPointer> "
"applied to %s at line %d\n",
ASN_EXPR_TYPE2STR($$->expr_type)
? ASN_EXPR_TYPE2STR($$->expr_type)
: "member",
$$->_lineno
);
}
} }
;
TypeDeclarationSet: TypeDeclarationSet:
BasicType { BasicType {
$$ = $1; $$ = $1;
} }
| TOK_CHOICE '{' AlternativeTypeLists {apply_nonstd_mods();} '}' { | TOK_CHOICE '{' AlternativeTypeLists '}' {
$$ = $3; $$ = $3;
assert($$->expr_type == A1TC_INVALID); assert($$->expr_type == A1TC_INVALID);
$$->expr_type = ASN_CONSTR_CHOICE; $$->expr_type = ASN_CONSTR_CHOICE;
$$->meta_type = AMT_TYPE; $$->meta_type = AMT_TYPE;
} }
| TOK_SEQUENCE '{' optComponentTypeLists {apply_nonstd_mods();} '}' { | TOK_SEQUENCE '{' optComponentTypeLists '}' {
$$ = $3; $$ = $3;
assert($$->expr_type == A1TC_INVALID); assert($$->expr_type == A1TC_INVALID);
$$->expr_type = ASN_CONSTR_SEQUENCE; $$->expr_type = ASN_CONSTR_SEQUENCE;
$$->meta_type = AMT_TYPE; $$->meta_type = AMT_TYPE;
} }
| TOK_SET '{' optComponentTypeLists {apply_nonstd_mods();} '}' { | TOK_SET '{' optComponentTypeLists '}' {
$$ = $3; $$ = $3;
assert($$->expr_type == A1TC_INVALID); assert($$->expr_type == A1TC_INVALID);
$$->expr_type = ASN_CONSTR_SET; $$->expr_type = ASN_CONSTR_SET;
@ -2249,22 +2270,6 @@ _fixup_anonymous_identifier(asn1p_expr_t *expr) {
expr->Identifier); expr->Identifier);
} }
static void
apply_nonstd_mods() {
if(!asn1p_as_pointer) return;
asn1p_as_pointer = 0;
if(asn1p_last_type) {
asn1p_last_type->marker.flags |= EM_INDIRECT;
fprintf(stderr, "INFO: Modifier <asn1c:pointer> "
"applied to \"%s\" at line %d\n",
asn1p_last_type->Identifier
? asn1p_last_type->Identifier : "<anonymous>",
asn1p_last_type->_lineno);
asn1p_last_type = 0;
}
}
extern char *asn1p_text; extern char *asn1p_text;
int int

View File

@ -508,6 +508,16 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri
if(flags & APF_LINE_COMMENTS && !(flags & APF_NOINDENT)) if(flags & APF_LINE_COMMENTS && !(flags & APF_NOINDENT))
INDENT("-- #line %d\n", tc->_lineno); INDENT("-- #line %d\n", tc->_lineno);
/* Reconstruct compiler directive information */
if((tc->marker.flags & EM_INDIRECT)
&& (tc->marker.flags & EM_OMITABLE) != EM_OMITABLE) {
if((flags & APF_NOINDENT))
printf(" --<ASN1C.RepresentAsPointer>-- ");
else
INDENT("--<ASN1C.RepresentAsPointer>--\n");
}
if(tc->Identifier) if(tc->Identifier)
INDENT("%s", tc->Identifier); INDENT("%s", tc->Identifier);
@ -623,15 +633,11 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri
== EM_OPTIONAL) { == EM_OPTIONAL) {
printf(" OPTIONAL"); printf(" OPTIONAL");
} }
if(TQ_NEXT(se, next)) if(TQ_NEXT(se, next)) {
printf(","); printf(",");
/* Reconstruct modifier information */ if(!(flags & APF_NOINDENT))
if((se->marker.flags & EM_OMITABLE) INDENT("\n");
!= EM_OMITABLE }
&& se->marker.flags & EM_INDIRECT)
printf("\t/* <asn1c:pointer> */");
if(TQ_NEXT(se, next) && !(flags & APF_NOINDENT))
INDENT("\n");
} }
if(put_braces && TQ_FIRST(&tc->members)) { if(put_braces && TQ_FIRST(&tc->members)) {

View File

@ -13,17 +13,21 @@ BEGIN
Sequence ::= SEQUENCE { Sequence ::= SEQUENCE {
ainl INTEGER, ainl INTEGER,
aptr INTEGER /* <asn1c:pointer> */ --<ASN1C.RepresentAsPointer>--
aptr INTEGER
} }
Set ::= SET { Set ::= SET {
ainl Sequence, ainl Sequence,
aptr Sequence -- <asn1c:pointer> --<ASN1C.RepresentAsPointer>--
aptr Sequence
} }
Choice ::= CHOICE { Choice ::= CHOICE {
setof SET OF INTEGER, -- <asn1c:pointer> --<ASN1C.RepresentAsPointer>--
aptr Sequence, -- <asn1c:pointer> setof SET OF INTEGER,
--<ASN1C.RepresentAsPointer>--
aptr Sequence,
ainl Sequence ainl Sequence
} }

View File

@ -5,17 +5,21 @@ BEGIN
Sequence ::= SEQUENCE { Sequence ::= SEQUENCE {
ainl [0] IMPLICIT INTEGER, ainl [0] IMPLICIT INTEGER,
aptr [1] IMPLICIT INTEGER /* <asn1c:pointer> */ --<ASN1C.RepresentAsPointer>--
aptr [1] IMPLICIT INTEGER
} }
Set ::= SET { Set ::= SET {
ainl [0] IMPLICIT Sequence, ainl [0] IMPLICIT Sequence,
aptr [1] IMPLICIT Sequence /* <asn1c:pointer> */ --<ASN1C.RepresentAsPointer>--
aptr [1] IMPLICIT Sequence
} }
Choice ::= CHOICE { Choice ::= CHOICE {
setof [0] IMPLICIT SET OF INTEGER, /* <asn1c:pointer> */ --<ASN1C.RepresentAsPointer>--
aptr [1] IMPLICIT Sequence, /* <asn1c:pointer> */ setof [0] IMPLICIT SET OF INTEGER,
--<ASN1C.RepresentAsPointer>--
aptr [1] IMPLICIT Sequence,
ainl [2] IMPLICIT Sequence ainl [2] IMPLICIT Sequence
} }

View File

@ -41,7 +41,7 @@ static ber_tlv_tag_t asn_DEF_Sequence_1_tags[] = {
}; };
static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = { static asn_TYPE_tag2member_t asn_MAP_Sequence_1_tag2el[] = {
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ainl at 15 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ainl at 15 */
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* aptr at 17 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* aptr at 18 */
}; };
static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = { static asn_SEQUENCE_specifics_t asn_SPC_Sequence_1_specs = {
sizeof(struct Sequence), sizeof(struct Sequence),
@ -138,8 +138,8 @@ static ber_tlv_tag_t asn_DEF_Set_1_tags[] = {
(ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) (ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
}; };
static asn_TYPE_tag2member_t asn_MAP_Set_1_tag2el[] = { static asn_TYPE_tag2member_t asn_MAP_Set_1_tag2el[] = {
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ainl at 20 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ainl at 21 */
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* aptr at 22 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* aptr at 24 */
}; };
static uint8_t asn_MAP_Set_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = { static uint8_t asn_MAP_Set_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
(1 << 7) | (1 << 6) (1 << 7) | (1 << 6)
@ -293,9 +293,9 @@ static asn_TYPE_member_t asn_MBR_Choice_1[] = {
}, },
}; };
static asn_TYPE_tag2member_t asn_MAP_Choice_1_tag2el[] = { static asn_TYPE_tag2member_t asn_MAP_Choice_1_tag2el[] = {
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* setof at 25 */ { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* setof at 28 */
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* aptr at 26 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* aptr at 30 */
{ (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ainl at 28 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ainl at 32 */
}; };
static asn_CHOICE_specifics_t asn_SPC_Choice_1_specs = { static asn_CHOICE_specifics_t asn_SPC_Choice_1_specs = {
sizeof(struct Choice), sizeof(struct Choice),