removed duplicate includes; moved CHOICE enumeration to higher level

git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@77 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
vlm 2004-08-11 05:21:32 +00:00
parent 8098252ba2
commit 33a4ff13f4
6 changed files with 150 additions and 114 deletions

View File

@ -101,6 +101,8 @@ CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CONFIGURE_DEPENDS = @CONFIGURE_DEPENDS@
CPLUSPLUS_FOUND_FALSE = @CPLUSPLUS_FOUND_FALSE@
CPLUSPLUS_FOUND_TRUE = @CPLUSPLUS_FOUND_TRUE@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@

View File

@ -45,31 +45,19 @@ static long compute_xxx_size(arg_t *arg, int _max);
OUT("/* Context for parsing across buffer boundaries */\n"); \
OUT("ber_dec_ctx_t _ber_dec_ctx;\n"));
#define DEPENDENCIES do { \
int saved_target = arg->target->target; \
int saved_indent = arg->indent_level; \
int comment_printed = 0; \
REDIR(OT_DEPS); \
arg->indent_level = 0; \
TQ_FOR(v, &(expr->members), next) { \
if((!(v->expr_type & ASN_CONSTR_MASK) \
&& v->expr_type > ASN_CONSTR_MASK) \
|| v->meta_type == AMT_TYPEREF) { \
if(!comment_printed++) \
OUT("/* Dependencies for %s */\n", \
asn1c_type_name(arg, expr, TNF_UNMODIFIED)); \
OUT("#include <%s.h>\n", \
asn1c_type_name(arg, v, TNF_INCLUDE)); \
} \
} \
if(expr->expr_type == ASN_CONSTR_SET_OF) \
OUT("#include <asn_SET_OF.h>\n"); \
if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF) \
OUT("#include <asn_SEQUENCE_OF.h>\n"); \
OUT("\n"); \
REDIR(saved_target); \
INDENT(saved_indent); \
} while(0)
#define DEPENDENCIES do { \
TQ_FOR(v, &(expr->members), next) { \
if((!(v->expr_type & ASN_CONSTR_MASK) \
&& v->expr_type > ASN_CONSTR_MASK) \
|| v->meta_type == AMT_TYPEREF) { \
GEN_INCLUDE(asn1c_type_name(arg, v, TNF_INCLUDE));\
} \
} \
if(expr->expr_type == ASN_CONSTR_SET_OF) \
GEN_INCLUDE("asn_SET_OF"); \
if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF) \
GEN_INCLUDE("asn_SEQUENCE_OF"); \
} while(0)
#define MKID(id) asn1c_make_identifier(0, (id), 0)
@ -187,10 +175,11 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) {
return -1;
}
REDIR(OT_STAT_DEFS);
GEN_INCLUDE("constr_SEQUENCE");
if(!arg->embed)
GEN_DECLARE(expr); /* asn1_DEF_xxx */
OUT("#include <constr_SEQUENCE.h>\n");
OUT("\n");
REDIR(OT_STAT_DEFS);
/*
* Print out the table according to which the parsing is performed.
@ -291,12 +280,6 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) {
OUT("};\n");
OUT("\n");
p = MKID(expr->Identifier);
REDIR(OT_DEPS);
OUT("#include <constr_SEQUENCE.h>\n");
OUT("\n");
if(!arg->embed)
OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p);
REDIR(OT_TYPE_DECLS);
return 0;
@ -413,12 +396,12 @@ asn1c_lang_C_type_SET_def(arg_t *arg) {
return -1;
}
GEN_INCLUDE("constr_SET");
if(!arg->embed)
GEN_DECLARE(expr); /* asn1_DEF_xxx */
REDIR(OT_STAT_DEFS);
OUT("#include <constr_SET.h>\n");
OUT("\n");
/*
* Print out the table according to which the parsing is performed.
*/
@ -542,11 +525,6 @@ asn1c_lang_C_type_SET_def(arg_t *arg) {
OUT("};\n");
OUT("\n");
REDIR(OT_DEPS);
OUT("#include <constr_SET.h>\n");
OUT("\n");
if(!arg->embed)
OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p);
REDIR(OT_TYPE_DECLS);
return 0;
@ -588,14 +566,16 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) {
int tags_impl_skip = 0;
char *p;
REDIR(OT_DEPS);
/*
* Print out the table according to which the parsing is performed.
*/
if(seq_of) {
OUT("#include <constr_SEQUENCE_OF.h>\n");
GEN_INCLUDE("constr_SEQUENCE_OF");
} else {
OUT("#include <constr_SET_OF.h>\n");
OUT("\n");
GEN_INCLUDE("constr_SET_OF");
}
if(!arg->embed)
GEN_DECLARE(expr); /* asn1_DEF_xxx */
REDIR(OT_STAT_DEFS);
@ -660,9 +640,6 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) {
OUT("};\n");
OUT("\n");
REDIR(OT_DEPS);
if(!arg->embed)
OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p);
REDIR(OT_TYPE_DECLS);
return 0;
@ -676,7 +653,29 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) {
DEPENDENCIES;
REDIR(OT_DEPS);
p = MKID(expr->Identifier);
OUT("typedef enum %s_PR {\n", p);
INDENTED(
p = MKID(expr->Identifier);
OUT("%s_PR_NOTHING,\t"
"/* No components present */\n", p);
TQ_FOR(v, &(expr->members), next) {
if(v->expr_type == A1TC_EXTENSIBLE) {
OUT("/* Extensions may appear below */\n");
continue;
}
p = MKID(expr->Identifier);
OUT("%s_PR_", p);
p = MKID(v->Identifier);
OUT("%s,\n", p, p);
}
);
p = MKID(expr->Identifier);
OUT("} %s_PR_e;\n", p);
REDIR(OT_TYPE_DECLS);
if(arg->embed) {
OUT("struct %s {\n", p);
@ -685,20 +684,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) {
}
INDENTED(
OUT("enum {\n");
INDENTED(
OUT("%s_PR_NOTHING,\t"
"/* No components present */\n", p);
TQ_FOR(v, &(expr->members), next) {
if(v->expr_type == A1TC_EXTENSIBLE) continue;
p = MKID(expr->Identifier);
OUT("%s_PR_", p);
p = MKID(v->Identifier);
OUT("%s,\n", p, p);
}
);
OUT("} present;\n");
OUT("%s_PR_e present;\n", p);
OUT("union {\n", p);
TQ_FOR(v, &(expr->members), next) {
EMBED(v);
@ -733,10 +719,11 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) {
return -1;
}
REDIR(OT_STAT_DEFS);
GEN_INCLUDE("constr_CHOICE");
if(!arg->embed)
GEN_DECLARE(expr); /* asn1_DEF_xxx */
OUT("#include <constr_CHOICE.h>\n");
OUT("\n");
REDIR(OT_STAT_DEFS);
/*
* Print out the table according to which the parsing is performed.
@ -844,9 +831,6 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) {
OUT("};\n");
OUT("\n");
REDIR(OT_DEPS);
if(!arg->embed)
OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p);
REDIR(OT_TYPE_DECLS);
return 0;
@ -916,9 +900,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
return 0;
}
REDIR(OT_DEPS);
OUT("#include <%s.h>\n", asn1c_type_name(arg, expr, TNF_INCLUDE));
GEN_INCLUDE(asn1c_type_name(arg, expr, TNF_INCLUDE));
REDIR(OT_TYPE_DECLS);
@ -1069,6 +1052,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
OUT("asn_struct_print_f %s_print;\n", p);
OUT("asn_struct_free_f %s_free;\n", p);
REDIR(OT_TYPE_DECLS);
return 0;
}

View File

@ -40,37 +40,6 @@ typedef struct arg_s {
#include "asn1c_out.h" /* Handle output during compilation */
#include "asn1c_save.h" /* Save compiled output */
#define INDENT(val) arg->indent_level += (val)
#define INDENTED(code) do { \
INDENT(+1); \
do { code; } while(0); \
INDENT(-1); \
} while(0)
#define FLAT(code) do { \
int _il = arg->indent_level; \
arg->indent_level = 0; \
do { code; } while(0); \
arg->indent_level = _il; \
} while(0)
#define EMBED(ev) do { \
REDIR(OT_TYPE_DECLS); \
arg->embed++; \
INDENTED(arg_t _tmp = *arg; \
_tmp.expr = ev; \
_tmp.default_cb(&_tmp); \
); \
arg->embed--; \
} while(0)
#define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args)
#define OUT_NOINDENT(fmt, args...) do { \
int _saved_indent = arg->indent_level; \
arg->indent_level = 0; \
asn1c_compiled_output(arg, fmt, ##args);\
arg->indent_level = _saved_indent; \
} while(0)
#define REDIR(foo) do { arg->target->target = foo; } while(0)
/*
* Logging.
*/

View File

@ -35,6 +35,8 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) {
if(ret == -1) return -1;
}
}
if(lf_found)
arg->indented = 0;
/*
* Estimate necessary size.
@ -66,10 +68,22 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) {
m->len = ret;
va_end(ap);
TQ_ADD(&(arg->target->targets[arg->target->target]), m, next);
if(arg->target->target == OT_INCLUDES) {
out_chunk_t *v;
TQ_FOR(v, &(arg->target->targets[OT_INCLUDES]), next) {
if(m->len == v->len
&& !memcmp(m->buf, v->buf, m->len))
break;
}
if(v) {
/* Entry is already present. Skip it. */
free(m->buf);
free(m);
return 0;
}
}
if(lf_found)
arg->indented = 0;
TQ_ADD(&(arg->target->targets[arg->target->target]), m, next);
return 0;
}

View File

@ -13,7 +13,8 @@ typedef struct out_chunk {
typedef struct compiler_streams {
enum {
OT_DEPS, /* Dependencies */
OT_INCLUDES, /* #include files */
OT_DEPS, /* Dependencies (other than #includes) */
OT_TYPE_DECLS, /* Type declarations */
OT_FUNC_DECLS, /* Function declarations */
OT_STAT_DEFS, /* Static definitions */
@ -24,8 +25,70 @@ typedef struct compiler_streams {
} compiler_streams_t;
static char *_compiler_stream2str[] __attribute__ ((unused))
= { "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" };
= { "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "STAT-DEFS", "CODE" };
int asn1c_compiled_output(arg_t *arg, const char *fmt, ...);
/*****************************************************************
* Useful macros for invoking asn1c_compiled_output() and friends.
*/
/* Redirect output to a different stream. */
#define REDIR(foo) do { arg->target->target = foo; } while(0)
#define INDENT(val) arg->indent_level += (val)
#define INDENTED(code) do { \
INDENT(+1); \
do { code; } while(0); \
INDENT(-1); \
} while(0)
#define FLAT(code) do { \
int _il = arg->indent_level; \
arg->indent_level = 0; \
do { code; } while(0); \
arg->indent_level = _il; \
} while(0)
#define EMBED(ev) do { \
int saved_target = arg->target->target; \
REDIR(OT_TYPE_DECLS); \
arg->embed++; \
INDENTED(arg_t _tmp = *arg; \
_tmp.expr = ev; \
_tmp.default_cb(&_tmp); \
); \
arg->embed--; \
assert(arg->target->target == OT_TYPE_DECLS); \
REDIR(saved_target); \
} while(0)
/* Output a piece of text into a default stream */
#define OUT(fmt, args...) asn1c_compiled_output(arg, fmt, ##args)
#define OUT_NOINDENT(fmt, args...) do { \
int _saved_indent = arg->indent_level; \
arg->indent_level = 0; \
OUT(fmt, ##args); \
arg->indent_level = _saved_indent; \
} while(0)
/* Generate #include line */
#define GEN_INCLUDE(filename) do { \
int saved_target = arg->target->target; \
REDIR(OT_INCLUDES); \
OUT_NOINDENT("#include <%s.h>\n", filename); \
REDIR(saved_target); \
} while(0)
/* Generate ASN.1 type declaration */
#define GEN_DECLARE(expr) do { \
int saved_target = arg->target->target; \
REDIR(OT_DEPS); \
OUT_NOINDENT("extern asn1_TYPE_descriptor_t " \
"asn1_DEF_%s;\n", \
MKID(expr->Identifier)); \
REDIR(saved_target); \
} while(0)
#endif /* _ASN1_COMPILED_OUTPUT_H_ */

View File

@ -180,6 +180,9 @@ asn1c_save_streams(arg_t *arg) {
fprintf(fp_h, "#include <constr_TYPE.h>\n\n");
TQ_FOR(ot, &(cs->targets[OT_INCLUDES]), next)
fwrite(ot->buf, ot->len, 1, fp_h);
fprintf(fp_h, "\n");
TQ_FOR(ot, &(cs->targets[OT_DEPS]), next)
fwrite(ot->buf, ot->len, 1, fp_h);
fprintf(fp_h, "\n");
@ -189,17 +192,17 @@ asn1c_save_streams(arg_t *arg) {
TQ_FOR(ot, &(cs->targets[OT_FUNC_DECLS]), next)
fwrite(ot->buf, ot->len, 1, fp_h);
fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier);
fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n"
"#endif\t/* _%s_H_ */\n",
header_id);
fprintf(fp_c, "#include <%s.h>\n\n", expr->Identifier); /* Myself */
TQ_FOR(ot, &(cs->targets[OT_STAT_DEFS]), next)
fwrite(ot->buf, ot->len, 1, fp_c);
TQ_FOR(ot, &(cs->targets[OT_CODE]), next)
fwrite(ot->buf, ot->len, 1, fp_c);
assert(OT_MAX == 5);
fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n"
"#endif\t/* _%s_H_ */\n",
header_id);
assert(OT_MAX == 6);
fclose(fp_c);
fclose(fp_h);