Commit 9b87e5b0 authored by Bi-Ruei, Chiu's avatar Bi-Ruei, Chiu

Fix 'declaration inside parameter list' warning

1. Add forward definition section.
2. Move type definition inside A_SEQUENCE_OF() to forward definition section.
3. Modify asn1c_lang_C_type_CHOICE() ...etc functions to achieve it.
4. Modify test cases used during 'make check'.
parent 73d449d4
...@@ -120,6 +120,7 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { ...@@ -120,6 +120,7 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) {
struct value2enum *v2e; struct value2enum *v2e;
int map_extensions = (expr->expr_type == ASN_BASIC_INTEGER); int map_extensions = (expr->expr_type == ASN_BASIC_INTEGER);
int eidx; int eidx;
int saved_target = arg->target->target;
v2e = alloca((el_count + 1) * sizeof(*v2e)); v2e = alloca((el_count + 1) * sizeof(*v2e));
...@@ -248,6 +249,8 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { ...@@ -248,6 +249,8 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) {
OUT("};\n"); OUT("};\n");
} }
REDIR(saved_target);
return asn1c_lang_C_type_SIMPLE_TYPE(arg); return asn1c_lang_C_type_SIMPLE_TYPE(arg);
} }
...@@ -256,6 +259,7 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) { ...@@ -256,6 +259,7 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) {
asn1p_expr_t *expr = arg->expr; asn1p_expr_t *expr = arg->expr;
asn1p_expr_t *v; asn1p_expr_t *v;
int el_count = expr_elements_count(arg, expr); int el_count = expr_elements_count(arg, expr);
int saved_target = arg->target->target;
if(el_count) { if(el_count) {
int eidx = 0; int eidx = 0;
...@@ -283,6 +287,8 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) { ...@@ -283,6 +287,8 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) {
assert(eidx == el_count); assert(eidx == el_count);
} }
REDIR(saved_target);
return asn1c_lang_C_type_SIMPLE_TYPE(arg); return asn1c_lang_C_type_SIMPLE_TYPE(arg);
} }
...@@ -291,14 +297,23 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { ...@@ -291,14 +297,23 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) {
asn1p_expr_t *expr = arg->expr; asn1p_expr_t *expr = arg->expr;
asn1p_expr_t *v; asn1p_expr_t *v;
int comp_mode = 0; /* {root,ext=1,root,root,...} */ int comp_mode = 0; /* {root,ext=1,root,root,...} */
int saved_target = arg->target->target;
DEPENDENCIES; DEPENDENCIES;
if(arg->embed) { if(arg->embed) {
/* Use _anonymous_type field to indicate it's called from
* asn1c_lang_C_type_SEx_OF() */
if (expr->_anonymous_type) {
REDIR(OT_FWD_DEFS);
OUT("typedef ");
}
OUT("struct "); OUT("struct ");
out_name_chain(arg, ONC_avoid_keywords); out_name_chain(arg, ONC_avoid_keywords);
OUT(" {\n"); OUT(" {\n");
} else { } else {
REDIR(OT_TYPE_DECLS);
OUT("typedef struct %s {\n", OUT("typedef struct %s {\n",
MKID_safe(expr)); MKID_safe(expr));
} }
...@@ -313,12 +328,24 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { ...@@ -313,12 +328,24 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) {
} }
PCTX_DEF; PCTX_DEF;
if (arg->embed && expr->_anonymous_type) {
OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
OUT("%s;\n", arg->embed ? "" : "_t");
REDIR(saved_target);
OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
} else {
OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
expr->_anonymous_type ? "" : expr->_anonymous_type ? "" :
arg->embed arg->embed
? MKID_safe(expr) ? MKID_safe(expr)
: MKID(expr), : MKID(expr),
arg->embed ? "" : "_t"); arg->embed ? "" : "_t");
}
return asn1c_lang_C_type_SEQUENCE_def(arg); return asn1c_lang_C_type_SEQUENCE_def(arg);
} }
...@@ -337,6 +364,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { ...@@ -337,6 +364,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) {
enum tvm_compat tv_mode; enum tvm_compat tv_mode;
int roms_count; /* Root optional members */ int roms_count; /* Root optional members */
int aoms_count; /* Additions optional members */ int aoms_count; /* Additions optional members */
int saved_target = arg->target->target;
/* /*
* Fetch every inner tag from the tag to elements map. * Fetch every inner tag from the tag to elements map.
...@@ -477,7 +505,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { ...@@ -477,7 +505,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) {
emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements,
ETD_HAS_SPECIFICS); ETD_HAS_SPECIFICS);
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} /* _SEQUENCE_def() */ } /* _SEQUENCE_def() */
...@@ -489,6 +517,7 @@ asn1c_lang_C_type_SET(arg_t *arg) { ...@@ -489,6 +517,7 @@ asn1c_lang_C_type_SET(arg_t *arg) {
long mcount; long mcount;
char *id; char *id;
int comp_mode = 0; /* {root,ext=1,root,root,...} */ int comp_mode = 0; /* {root,ext=1,root,root,...} */
int saved_target = arg->target->target;
DEPENDENCIES; DEPENDENCIES;
...@@ -515,13 +544,18 @@ asn1c_lang_C_type_SET(arg_t *arg) { ...@@ -515,13 +544,18 @@ asn1c_lang_C_type_SET(arg_t *arg) {
} }
OUT("} "); out_name_chain(arg, ONC_noflags); OUT("_PR;\n"); OUT("} "); out_name_chain(arg, ONC_noflags); OUT("_PR;\n");
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
if(arg->embed) { if(arg->embed) {
if (expr->_anonymous_type) {
REDIR(OT_FWD_DEFS);
OUT("typedef ");
}
OUT("struct "); OUT("struct ");
out_name_chain(arg, ONC_avoid_keywords); out_name_chain(arg, ONC_avoid_keywords);
OUT(" {\n"); OUT(" {\n");
} else { } else {
REDIR(OT_TYPE_DECLS);
OUT("typedef struct %s {\n", OUT("typedef struct %s {\n",
MKID_safe(expr)); MKID_safe(expr));
} }
...@@ -545,9 +579,21 @@ asn1c_lang_C_type_SET(arg_t *arg) { ...@@ -545,9 +579,21 @@ asn1c_lang_C_type_SET(arg_t *arg) {
); );
PCTX_DEF; PCTX_DEF;
if (arg->embed && expr->_anonymous_type) {
OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
OUT("%s;\n", arg->embed ? "" : "_t");
REDIR(saved_target);
OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
} else {
OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
expr->_anonymous_type ? "" : MKID_safe(expr), expr->_anonymous_type ? "" : MKID_safe(expr),
arg->embed ? "" : "_t"); arg->embed ? "" : "_t");
}
return asn1c_lang_C_type_SET_def(arg); return asn1c_lang_C_type_SET_def(arg);
} }
...@@ -565,6 +611,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { ...@@ -565,6 +611,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) {
int all_tags_count; int all_tags_count;
enum tvm_compat tv_mode; enum tvm_compat tv_mode;
char *p; char *p;
int saved_target = arg->target->target;
/* /*
* Fetch every inner tag from the tag to elements map. * Fetch every inner tag from the tag to elements map.
...@@ -692,7 +739,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { ...@@ -692,7 +739,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) {
emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements,
ETD_HAS_SPECIFICS); ETD_HAS_SPECIFICS);
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} /* _SET_def() */ } /* _SET_def() */
...@@ -701,10 +748,15 @@ int ...@@ -701,10 +748,15 @@ int
asn1c_lang_C_type_SEx_OF(arg_t *arg) { asn1c_lang_C_type_SEx_OF(arg_t *arg) {
asn1p_expr_t *expr = arg->expr; asn1p_expr_t *expr = arg->expr;
asn1p_expr_t *memb = TQ_FIRST(&expr->members); asn1p_expr_t *memb = TQ_FIRST(&expr->members);
int saved_target = arg->target->target;
DEPENDENCIES; DEPENDENCIES;
if(arg->embed) { if(arg->embed) {
if (expr->_anonymous_type) {
REDIR(OT_FWD_DEFS);
OUT("typedef ");
}
OUT("struct "); OUT("struct ");
out_name_chain(arg, ONC_avoid_keywords); out_name_chain(arg, ONC_avoid_keywords);
OUT(" {\n"); OUT(" {\n");
...@@ -748,7 +800,8 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { ...@@ -748,7 +800,8 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) {
if(tmp_memb.Identifier != memb->Identifier) if(tmp_memb.Identifier != memb->Identifier)
if(0) free(tmp_memb.Identifier); if(0) free(tmp_memb.Identifier);
arg->embed--; arg->embed--;
assert(arg->target->target == OT_TYPE_DECLS); assert(arg->target->target == OT_TYPE_DECLS ||
arg->target->target == OT_FWD_DEFS);
} else { } else {
OUT("%s", asn1c_type_name(arg, memb, OUT("%s", asn1c_type_name(arg, memb,
(memb->marker.flags & EM_UNRECURSE) (memb->marker.flags & EM_UNRECURSE)
...@@ -761,9 +814,21 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { ...@@ -761,9 +814,21 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) {
INDENT(-1); INDENT(-1);
PCTX_DEF; PCTX_DEF;
if (arg->embed && expr->_anonymous_type) {
OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
OUT("%s;\n", arg->embed ? "" : "_t");
REDIR(saved_target);
OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
} else {
OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
expr->_anonymous_type ? "" : MKID_safe(expr), expr->_anonymous_type ? "" : MKID_safe(expr),
arg->embed ? "" : "_t"); arg->embed ? "" : "_t");
}
/* /*
* SET OF/SEQUENCE OF definition * SET OF/SEQUENCE OF definition
...@@ -779,6 +844,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { ...@@ -779,6 +844,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) {
int tags_count; int tags_count;
int all_tags_count; int all_tags_count;
enum tvm_compat tv_mode; enum tvm_compat tv_mode;
int saved_target = arg->target->target;
/* /*
* Print out the table according to which parsing is performed. * Print out the table according to which parsing is performed.
...@@ -840,7 +906,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { ...@@ -840,7 +906,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) {
emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1, emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1,
ETD_HAS_SPECIFICS); ETD_HAS_SPECIFICS);
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} /* _SEx_OF_def() */ } /* _SEx_OF_def() */
...@@ -850,6 +916,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ...@@ -850,6 +916,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) {
asn1p_expr_t *expr = arg->expr; asn1p_expr_t *expr = arg->expr;
asn1p_expr_t *v; asn1p_expr_t *v;
char *id; char *id;
int saved_target = arg->target->target;
DEPENDENCIES; DEPENDENCIES;
...@@ -878,11 +945,16 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ...@@ -878,11 +945,16 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) {
); );
OUT("} "); out_name_chain(arg, ONC_noflags); OUT("_PR;\n"); OUT("} "); out_name_chain(arg, ONC_noflags); OUT("_PR;\n");
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
if(arg->embed) { if(arg->embed) {
if (expr->_anonymous_type) {
REDIR(OT_FWD_DEFS);
OUT("typedef ");
}
OUT("struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n"); OUT("struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n");
} else { } else {
REDIR(OT_TYPE_DECLS);
OUT("typedef struct %s {\n", MKID_safe(expr)); OUT("typedef struct %s {\n", MKID_safe(expr));
} }
...@@ -903,12 +975,24 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ...@@ -903,12 +975,24 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) {
); );
PCTX_DEF; PCTX_DEF;
if (arg->embed && expr->_anonymous_type) {
OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
OUT("%s;\n", arg->embed ? "" : "_t");
REDIR(saved_target);
OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":"");
out_name_chain(arg, ONC_avoid_keywords);
} else {
OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
expr->_anonymous_type ? "" : expr->_anonymous_type ? "" :
arg->embed arg->embed
? MKID_safe(expr) ? MKID_safe(expr)
: MKID(expr), : MKID(expr),
arg->embed ? "" : "_t"); arg->embed ? "" : "_t");
}
return asn1c_lang_C_type_CHOICE_def(arg); return asn1c_lang_C_type_CHOICE_def(arg);
} }
...@@ -924,6 +1008,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { ...@@ -924,6 +1008,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) {
int all_tags_count; int all_tags_count;
enum tvm_compat tv_mode; enum tvm_compat tv_mode;
int *cmap = 0; int *cmap = 0;
int saved_target = arg->target->target;
/* /*
* Fetch every inner tag from the tag to elements map. * Fetch every inner tag from the tag to elements map.
...@@ -1026,7 +1111,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { ...@@ -1026,7 +1111,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) {
emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements,
ETD_HAS_SPECIFICS); ETD_HAS_SPECIFICS);
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} /* _CHOICE_def() */ } /* _CHOICE_def() */
...@@ -1081,6 +1166,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { ...@@ -1081,6 +1166,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
enum tvm_compat tv_mode; enum tvm_compat tv_mode;
enum etd_spec etd_spec; enum etd_spec etd_spec;
char *p; char *p;
int saved_target = arg->target->target;
if(arg->embed) { if(arg->embed) {
enum tnfmt tnfmt = TNF_CTYPE; enum tnfmt tnfmt = TNF_CTYPE;
...@@ -1093,13 +1179,15 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { ...@@ -1093,13 +1179,15 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
if(expr->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) { if(expr->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) {
if(terminal_structable(arg, expr)) { if(terminal_structable(arg, expr)) {
tnfmt = TNF_RSAFE; tnfmt = TNF_RSAFE;
if(saved_target != OT_FWD_DECLS) {
REDIR(OT_FWD_DECLS); REDIR(OT_FWD_DECLS);
OUT("%s;\n", OUT("%s;\n",
asn1c_type_name(arg, arg->expr, tnfmt)); asn1c_type_name(arg, arg->expr, tnfmt));
} }
REDIR(saved_target);
}
} }
REDIR(OT_TYPE_DECLS);
OUT("%s", asn1c_type_name(arg, arg->expr, tnfmt)); OUT("%s", asn1c_type_name(arg, arg->expr, tnfmt));
if(!expr->_anonymous_type) { if(!expr->_anonymous_type) {
...@@ -1143,7 +1231,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { ...@@ -1143,7 +1231,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
* Type1 ::= Type2 * Type1 ::= Type2
*/ */
if(arg->embed && etd_spec == ETD_NO_SPECIFICS) { if(arg->embed && etd_spec == ETD_NO_SPECIFICS) {
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} }
if((!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS)) if((!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS))
...@@ -1165,7 +1253,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { ...@@ -1165,7 +1253,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
REDIR(OT_CODE); REDIR(OT_CODE);
OUT("/* This type is equivalent to %s */\n", type_name); OUT("/* This type is equivalent to %s */\n", type_name);
OUT("\n"); OUT("\n");
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} }
...@@ -1418,7 +1506,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { ...@@ -1418,7 +1506,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
} }
} }
REDIR(OT_TYPE_DECLS); REDIR(saved_target);
return 0; return 0;
} }
...@@ -2620,9 +2708,11 @@ emit_include_dependencies(arg_t *arg) { ...@@ -2620,9 +2708,11 @@ emit_include_dependencies(arg_t *arg) {
if(memb->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) { if(memb->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) {
if(terminal_structable(arg, memb)) { if(terminal_structable(arg, memb)) {
int saved_target = arg->target->target; int saved_target = arg->target->target;
if(saved_target != OT_FWD_DECLS) {
REDIR(OT_FWD_DECLS); REDIR(OT_FWD_DECLS);
OUT("%s;\n", OUT("%s;\n",
asn1c_type_name(arg, memb, TNF_RSAFE)); asn1c_type_name(arg, memb, TNF_RSAFE));
}
REDIR(saved_target); REDIR(saved_target);
} }
} }
......
...@@ -38,6 +38,11 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { ...@@ -38,6 +38,11 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) {
*/ */
if(dst->indented == 0) { if(dst->indented == 0) {
int i = dst->indent_level; int i = dst->indent_level;
if (i < 0) {
/* fatal error */
fprintf(stderr, "target %d : Indent level %d ?!\n", arg->target->target, i);
exit(1);
}
dst->indented = 1; dst->indented = 1;
while(i--) { while(i--) {
ret = asn1c_compiled_output(arg, "\t"); ret = asn1c_compiled_output(arg, "\t");
......
...@@ -17,6 +17,7 @@ typedef struct compiler_streams { ...@@ -17,6 +17,7 @@ typedef struct compiler_streams {
OT_INCLUDES, /* #include files */ OT_INCLUDES, /* #include files */
OT_DEPS, /* Dependencies (other than #includes) */ OT_DEPS, /* Dependencies (other than #includes) */
OT_FWD_DECLS, /* Forward declarations */ OT_FWD_DECLS, /* Forward declarations */
OT_FWD_DEFS, /* Forward definitions */
OT_TYPE_DECLS, /* Type declarations */ OT_TYPE_DECLS, /* Type declarations */
OT_FUNC_DECLS, /* Function declarations */ OT_FUNC_DECLS, /* Function declarations */
OT_POST_INCLUDE,/* #include after type definition */ OT_POST_INCLUDE,/* #include after type definition */
...@@ -35,7 +36,7 @@ typedef struct compiler_streams { ...@@ -35,7 +36,7 @@ typedef struct compiler_streams {
} compiler_streams_t; } compiler_streams_t;
static char *_compiler_stream2str[] __attribute__ ((unused)) static char *_compiler_stream2str[] __attribute__ ((unused))
= { "IGNORE", "INCLUDES", "DEPS", "FWD-DECLS", "TYPE-DECLS", "FUNC-DECLS", "POST-INCLUDE", "CTABLES", "CODE", "CTDEFS", "STAT-DEFS" }; = { "IGNORE", "INCLUDES", "DEPS", "FWD-DECLS", "FWD-DEFS", "TYPE-DECLS", "FUNC-DECLS", "POST-INCLUDE", "CTABLES", "CODE", "CTDEFS", "STAT-DEFS" };
int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); int asn1c_compiled_output(arg_t *arg, const char *fmt, ...);
...@@ -56,8 +57,6 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); ...@@ -56,8 +57,6 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...);
} while(0) } while(0)
#define EMBED(ev) do { \ #define EMBED(ev) do { \
int saved_target = arg->target->target; \
REDIR(OT_TYPE_DECLS); \
arg->embed++; \ arg->embed++; \
INDENTED(arg_t _tmp = *arg; \ INDENTED(arg_t _tmp = *arg; \
_tmp.expr = ev; \ _tmp.expr = ev; \
...@@ -66,8 +65,8 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); ...@@ -66,8 +65,8 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...);
arg->embed--; \ arg->embed--; \
if(ev->expr_type != A1TC_EXTENSIBLE) \ if(ev->expr_type != A1TC_EXTENSIBLE) \
OUT(";\n"); \ OUT(";\n"); \
assert(arg->target->target == OT_TYPE_DECLS); \ assert(arg->target->target == OT_TYPE_DECLS || \
REDIR(saved_target); \ arg->target->target == OT_FWD_DEFS); \
} while(0) } while(0)
/* Output a piece of text into a default stream */ /* Output a piece of text into a default stream */
......
...@@ -283,6 +283,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) { ...@@ -283,6 +283,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) {
safe_fprintf(fp_h, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); safe_fprintf(fp_h, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
SAVE_STREAM(fp_h, OT_DEPS, "Dependencies", 0); SAVE_STREAM(fp_h, OT_DEPS, "Dependencies", 0);
SAVE_STREAM(fp_h, OT_FWD_DECLS, "Forward declarations", 0); SAVE_STREAM(fp_h, OT_FWD_DECLS, "Forward declarations", 0);
SAVE_STREAM(fp_h, OT_FWD_DEFS, "Forward definitions", 0);
SAVE_STREAM(fp_h, OT_TYPE_DECLS, expr->Identifier, 0); SAVE_STREAM(fp_h, OT_TYPE_DECLS, expr->Identifier, 0);
SAVE_STREAM(fp_h, OT_FUNC_DECLS,"Implementation", 0); SAVE_STREAM(fp_h, OT_FUNC_DECLS,"Implementation", 0);
safe_fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n"); safe_fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n");
...@@ -305,7 +306,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) { ...@@ -305,7 +306,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) {
TQ_FOR(ot, &(cs->destination[OT_STAT_DEFS].chunks), next) TQ_FOR(ot, &(cs->destination[OT_STAT_DEFS].chunks), next)
safe_fwrite(ot->buf, ot->len, 1, fp_c); safe_fwrite(ot->buf, ot->len, 1, fp_c);
assert(OT_MAX == 11); /* Protection from reckless changes */ assert(OT_MAX == 12); /* Protection from reckless changes */
fclose(fp_c); fclose(fp_c);
fclose(fp_h); fclose(fp_h);
......
...@@ -184,6 +184,19 @@ typedef enum other_PR { ...@@ -184,6 +184,19 @@ typedef enum other_PR {
struct Forest; struct Forest;
/*** <<< FWD-DEFS [Stuff] >>> ***/
typedef struct Member {
BIT_STRING_t cup_of_coffee;
/*
* This type is extensible,
* possible extensions are below.
*/
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} Member;
/*** <<< TYPE-DECLS [Stuff] >>> ***/ /*** <<< TYPE-DECLS [Stuff] >>> ***/
typedef struct Stuff { typedef struct Stuff {
...@@ -194,16 +207,7 @@ typedef struct Stuff { ...@@ -194,16 +207,7 @@ typedef struct Stuff {
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
} *trees; } *trees;
struct anything { struct anything {
A_SET_OF(struct Member { A_SET_OF(Member) list;
BIT_STRING_t cup_of_coffee;
/*
* This type is extensible,
* possible extensions are below.
*/
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} ) list;
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
......
...@@ -7,16 +7,20 @@ ...@@ -7,16 +7,20 @@
#include <constr_SEQUENCE.h> #include <constr_SEQUENCE.h>
#include <constr_SET_OF.h> #include <constr_SET_OF.h>
/*** <<< TYPE-DECLS [Type] >>> ***/ /*** <<< FWD-DEFS [Type] >>> ***/
typedef struct Type { typedef struct Member {
A_SET_OF(struct Member {
Type1_t t1; Type1_t t1;
Type2_t t2; Type2_t t2;
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
} ) list; } Member;
/*** <<< TYPE-DECLS [Type] >>> ***/
typedef struct Type {
A_SET_OF(Member) list;
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
......
...@@ -623,10 +623,9 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = { ...@@ -623,10 +623,9 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = {
struct Set; struct Set;
struct Sequence; struct Sequence;
/*** <<< TYPE-DECLS [Set] >>> ***/ /*** <<< FWD-DEFS [Set] >>> ***/
typedef struct Set { typedef struct Member {
A_SET_OF(struct Member {
long Int; long Int;
struct Set *set; struct Set *set;
struct Sequence *seq; struct Sequence *seq;
...@@ -639,7 +638,12 @@ typedef struct Set { ...@@ -639,7 +638,12 @@ typedef struct Set {
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
} ) list; } Member;
/*** <<< TYPE-DECLS [Set] >>> ***/
typedef struct Set {
A_SET_OF(Member) list;
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
......
...@@ -622,10 +622,9 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = { ...@@ -622,10 +622,9 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = {
struct Set; struct Set;
struct Sequence; struct Sequence;
/*** <<< TYPE-DECLS [Set] >>> ***/ /*** <<< FWD-DEFS [Set] >>> ***/
typedef struct Set { typedef struct Member {
A_SET_OF(struct Member {
INTEGER_t Int; INTEGER_t Int;
struct Set *set; struct Set *set;
struct Sequence *seq; struct Sequence *seq;
...@@ -638,7 +637,12 @@ typedef struct Set { ...@@ -638,7 +637,12 @@ typedef struct Set {
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
} ) list; } Member;
/*** <<< TYPE-DECLS [Set] >>> ***/
typedef struct Set {
A_SET_OF(Member) list;
/* Context for parsing across buffer boundaries */ /* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx; asn_struct_ctx_t _asn_ctx;
......
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