diff options
author | Lev Walkin <vlm@lionet.info> | 2005-01-28 12:18:50 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2005-01-28 12:18:50 +0000 |
commit | 801fabc3e19811878d81151462aa3c892d378630 (patch) | |
tree | 6582247f37c9b61220fff355db7cff470a8592c8 /libasn1compiler | |
parent | 23fd2fa6d5aada35f2f8a3197dbe81544d4431d7 (diff) |
checking reserved keywords and double identifiers
Diffstat (limited to 'libasn1compiler')
-rw-r--r-- | libasn1compiler/asn1c_C.c | 140 | ||||
-rw-r--r-- | libasn1compiler/asn1c_constraint.c | 2 | ||||
-rw-r--r-- | libasn1compiler/asn1c_misc.c | 53 | ||||
-rw-r--r-- | libasn1compiler/asn1c_misc.h | 18 | ||||
-rw-r--r-- | libasn1compiler/asn1compiler.h | 4 |
5 files changed, 151 insertions, 66 deletions
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 5e0d0cdf..91b15eb7 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -35,6 +35,7 @@ static int expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr); static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr); static int emit_member_table(arg_t *arg, asn1p_expr_t *expr); static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier); +static int out_identifiers_chain(arg_t *arg, int check_reserved_keywords); enum tvm_compat { _TVM_SAME = 0, /* tags and all_tags are same */ @@ -65,7 +66,7 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode && __m->expr_type > ASN_CONSTR_MASK) \ || __m->meta_type == AMT_TYPEREF) { \ GEN_INCLUDE(asn1c_type_name(arg, \ - __m, TNF_INCLUDE)); \ + __m, TNF_INCLUDE)); \ } \ } \ if(expr->expr_type == ASN_CONSTR_SET_OF) \ @@ -74,7 +75,9 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode GEN_INCLUDE("asn_SEQUENCE_OF"); \ } while(0) -#define MKID(id) asn1c_make_identifier(0, (id), 0) +/* MKID() without checking for reserved keywords */ +#define MKID_nr(id) asn1c_make_identifier(0, (id), 0) +#define MKID(id) asn1c_make_identifier(AMI_CHECK_RESERVED, (id), 0) int asn1c_lang_C_type_REAL(arg_t *arg) { @@ -126,7 +129,7 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { DEPENDENCIES; if(arg->embed) { - OUT("struct %s {\n", MKID(expr->Identifier)); + OUT("struct "); out_identifiers_chain(arg, 1); OUT(" {\n"); } else { OUT("typedef struct %s {\n", MKID(expr->Identifier)); @@ -184,7 +187,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { if(expr_elements_count(arg, expr)) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ - p = MKID(expr->Identifier); + p = MKID_nr(expr->Identifier); OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", p); elements = 0; @@ -214,12 +217,13 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { */ emit_tag2member_map(arg, tag2el, tag2el_count, 0); + OUT("static asn_SEQUENCE_specifics_t asn_DEF_%s_specs = {\n", + MKID_nr(expr->Identifier)); p = MKID(expr->Identifier); - OUT("static asn_SEQUENCE_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _asn_ctx),\n", p); - OUT("asn_DEF_%s_tag2el,\n", p); + OUT("asn_DEF_%s_tag2el,\n", MKID_nr(expr->Identifier)); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d,\t/* Start extensions */\n", ext_start); @@ -256,26 +260,26 @@ asn1c_lang_C_type_SET(arg_t *arg) { OUT(" * Method of determining the components presence\n"); OUT(" */\n"); mcount = 0; - OUT("typedef enum %s_PR {\n", MKID(expr->Identifier)); + OUT("typedef enum "); out_identifiers_chain(arg, 0); OUT("_PR {\n"); TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) continue; INDENTED( - id = MKID(expr->Identifier); - OUT("%s_PR_", id); - id = MKID(v->Identifier); + out_identifiers_chain(arg, 0); + OUT("_PR_"); + id = MKID_nr(v->Identifier); OUT("%s,\t/* Member %s is present */\n", id, id) ); mcount++; } - id = MKID(expr->Identifier); - OUT("} %s_PR;\n", id); + OUT("} "); out_identifiers_chain(arg, 0); OUT("_PR;\n"); REDIR(OT_TYPE_DECLS); if(arg->embed) { - OUT("struct %s {\n", id); + OUT("struct "); out_identifiers_chain(arg, 1); OUT(" {\n"); } else { + id = MKID(expr->Identifier); OUT("typedef struct %s {\n", id); } @@ -290,7 +294,7 @@ asn1c_lang_C_type_SET(arg_t *arg) { } INDENTED( - id = MKID(expr->Identifier); + id = MKID_nr(expr->Identifier); OUT("\n"); OUT("/* Presence bitmask: ASN_SET_ISPRESENT(p%s, %s_PR_x) */\n", id, id); @@ -350,8 +354,8 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { if(expr_elements_count(arg, expr)) { int comp_mode = 0; /* {root,ext=1,root,root,...} */ - p = MKID(expr->Identifier); - OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", p); + OUT("static asn_TYPE_member_t asn_MBR_%s[] = {\n", + MKID_nr(expr->Identifier)); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { @@ -385,8 +389,9 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { /* * Emit a map of mandatory elements. */ + OUT("static uint8_t asn_DEF_%s_mmap", + MKID_nr(expr->Identifier)); p = MKID(expr->Identifier); - OUT("static uint8_t asn_DEF_%s_mmap", p); OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements); OUT(" = {\n", p); INDENTED( @@ -415,11 +420,14 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("\n"); OUT("};\n"); - OUT("static asn_SET_specifics_t asn_DEF_%s_specs = {\n", p); + OUT("static asn_SET_specifics_t asn_DEF_%s_specs = {\n", + MKID_nr(expr->Identifier)); + p = MKID(expr->Identifier); INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _asn_ctx),\n", p); OUT("offsetof(struct %s, _presence_map),\n", p); + p = MKID_nr(expr->Identifier); OUT("asn_DEF_%s_tag2el,\n", p); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); if(tag2el_cxer) @@ -452,7 +460,7 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { DEPENDENCIES; if(arg->embed) { - OUT("struct %s {\n", MKID(expr->Identifier)); + OUT("struct "); out_identifiers_chain(arg, 1); OUT(" {\n"); } else { OUT("typedef struct %s {\n", MKID(expr->Identifier)); } @@ -483,7 +491,7 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { arg->embed--; assert(arg->target->target == OT_TYPE_DECLS); } else { - OUT("%s", asn1c_type_name(arg, memb, TNF_CTYPE)); + OUT("%s", asn1c_type_name(arg, memb, TNF_CTYPE | TNF_CHECK)); } OUT(") list;\n"); INDENT(-1); @@ -545,8 +553,9 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); + OUT("static asn_SET_OF_specifics_t asn_DEF_%s_specs = {\n", + MKID_nr(expr->Identifier)); p = MKID(expr->Identifier); - OUT("static asn_SET_OF_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _asn_ctx),\n", p); @@ -578,36 +587,36 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { REDIR(OT_DEPS); - id = MKID(expr->Identifier); - OUT("typedef enum %s_PR {\n", id); + OUT("typedef enum "); out_identifiers_chain(arg, 0); OUT("_PR {\n"); INDENTED( - OUT("%s_PR_NOTHING,\t" - "/* No components present */\n", id); + out_identifiers_chain(arg, 0); + OUT("_PR_NOTHING,\t/* No components present */\n"); TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) { OUT("/* Extensions may appear below */\n"); continue; } - id = MKID(expr->Identifier); - OUT("%s_PR_", id); - id = MKID(v->Identifier); + out_identifiers_chain(arg, 0); + OUT("_PR_"); + id = MKID_nr(v->Identifier); OUT("%s,\n", id, id); } ); - id = MKID(expr->Identifier); - OUT("} %s_PR;\n", id); + OUT("} "); out_identifiers_chain(arg, 0); OUT("_PR;\n"); REDIR(OT_TYPE_DECLS); if(arg->embed) { - OUT("struct %s {\n", id); + OUT("struct "); out_identifiers_chain(arg, 1); OUT(" {\n"); } else { + id = MKID(expr->Identifier); OUT("typedef struct %s {\n", id); } INDENTED( - OUT("%s_PR present;\n", id); - OUT("union {\n", id); + out_identifiers_chain(arg, 0); + OUT("_PR present;\n"); + OUT("union {\n"); TQ_FOR(v, &(expr->members), next) { if(expr_better_indirect(arg, v)) v->marker.flags |= EM_INDIRECT; @@ -690,14 +699,15 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { */ emit_tag2member_map(arg, tag2el, tag2el_count, 0); + OUT("static asn_CHOICE_specifics_t asn_DEF_%s_specs = {\n", + MKID_nr(expr->Identifier)); p = MKID(expr->Identifier); - OUT("static asn_CHOICE_specifics_t asn_DEF_%s_specs = {\n", p); INDENTED( OUT("sizeof(struct %s),\n", p); OUT("offsetof(struct %s, _asn_ctx),\n", p); OUT("offsetof(struct %s, present),\n", p); OUT("sizeof(((struct %s *)0)->present),\n", p); - OUT("asn_DEF_%s_tag2el,\n", p); + OUT("asn_DEF_%s_tag2el,\n", MKID_nr(expr->Identifier)); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d\t/* Whether extensible */\n", check_if_extensible(expr)); @@ -784,13 +794,13 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { tnfmt = TNF_RSAFE; OUT("\n"); OUT("%s;\t/* Forward declaration */\n", - asn1c_type_name(arg, arg->expr, tnfmt)); + asn1c_type_name(arg, arg->expr, tnfmt | TNF_CHECK)); } } REDIR(OT_TYPE_DECLS); - OUT("%s\t", asn1c_type_name(arg, arg->expr, tnfmt)); + OUT("%s\t", asn1c_type_name(arg, arg->expr, tnfmt | TNF_CHECK)); OUT("%s", expr->marker.flags?"*":" "); OUT("%s", MKID(expr->Identifier)); if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT) @@ -808,7 +818,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_TYPE_DECLS); - OUT("typedef %s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); + OUT("typedef %s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE | TNF_CHECK)); OUT("%s", expr->marker.flags?"*":" "); OUT("%s_t", MKID(expr->Identifier)); @@ -824,9 +834,8 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_FUNC_DECLS); type_name = asn1c_type_name(arg, expr, TNF_SAFE); OUT("/* This type is equivalent to %s */\n", type_name); - p = MKID(expr->Identifier); if(HIDE_INNER_DEFS) OUT("/* "); - OUT("#define\tasn_DEF_%s\t", p); + OUT("#define\tasn_DEF_%s\t", MKID_nr(expr->Identifier)); type_name = asn1c_type_name(arg, expr, TNF_SAFE); OUT("asn_DEF_%s\n", type_name); if(HIDE_INNER_DEFS) @@ -987,7 +996,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_FUNC_DECLS); - p = MKID(expr->Identifier); + p = MKID_nr(expr->Identifier); if(HIDE_INNER_DEFS) OUT("/* "); OUT("extern asn_TYPE_descriptor_t asn_DEF_%s;", p); if(HIDE_INNER_DEFS) OUT(" // (Use -fall-defs-global to expose) */"); @@ -1237,7 +1246,7 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char * asn1p_expr_t *expr = arg->expr; OUT("static asn_TYPE_tag2member_t asn_DEF_%s_tag2el%s[] = {\n", - MKID(expr->Identifier), opt_modifier?opt_modifier:""); + MKID_nr(expr->Identifier), opt_modifier?opt_modifier:""); if(tag2el_count) { int i; for(i = 0; i < tag2el_count; i++) { @@ -1303,7 +1312,7 @@ emit_tags_vectors(arg_t *arg, asn1p_expr_t *expr, int *tags_count_r, int *all_ta #define EMIT_TAGS_TABLE(name, tags, tags_count) do { \ OUT("static ber_tlv_tag_t asn_DEF_%s%s_tags[] = {\n", \ - MKID(expr->Identifier), name); \ + MKID_nr(expr->Identifier), name); \ INDENT(+1); \ /* Print the array of collected tags */ \ for(i = 0; i < tags_count; i++) { \ @@ -1423,10 +1432,10 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(C99_MODE) OUT(".type = "); if(expr->_anonymous_type && (expr->expr_type & ASN_CONSTR_MASK)) { OUT("(void *)&asn_DEF_%s_member,\n", - MKID(arg->expr->Identifier)); + MKID_nr(arg->expr->Identifier)); } else if(expr->expr_type & ASN_CONSTR_MASK) { OUT("(void *)&asn_DEF_%s,\n", - MKID(expr->Identifier)); + MKID_nr(expr->Identifier)); } else { OUT("(void *)&asn_DEF_%s,\n", asn1c_type_name(arg, expr, TNF_SAFE)); @@ -1436,7 +1445,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(arg->flags & A1C_NO_CONSTRAINTS) { OUT("0,\t/* No check because of -fno-constraints */\n"); } else { - char *id = MKID(expr->Identifier); + char *id = MKID_nr(expr->Identifier); if(expr->_anonymous_type && !strcmp(expr->Identifier, "member")) id = asn1c_type_name(arg, expr, TNF_SAFE); @@ -1460,7 +1469,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { if(expr->_anonymous_type && !strcmp(expr->Identifier, "member")) p = asn1c_type_name(arg, expr, TNF_SAFE); else - p = MKID(expr->Identifier); + p = MKID_nr(expr->Identifier); OUT("static int\n"); OUT("memb_%s_%d_constraint(asn_TYPE_descriptor_t *td, const void *sptr,\n", p, global_memb_unique); INDENT(+1); @@ -1487,10 +1496,11 @@ static int emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_count, int all_tags_count, int elements_count, enum etd_spec spec) { char *p; - p = MKID(expr->Identifier); if(HIDE_INNER_DEFS) OUT("static /* Use -fall-defs-global to expose */\n"); - OUT("asn_TYPE_descriptor_t asn_DEF_%s = {\n", p); + OUT("asn_TYPE_descriptor_t asn_DEF_%s = {\n", + MKID_nr(expr->Identifier)); + p = MKID(expr->Identifier); INDENT(+1); OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier); @@ -1515,14 +1525,13 @@ emit_type_DEF(arg_t *arg, asn1p_expr_t *expr, enum tvm_compat tv_mode, int tags_ } OUT("%s_encode_xer,\n", p); - p = MKID(expr->Identifier); - if(expr->expr_type == ASN_CONSTR_CHOICE) { OUT("CHOICE_outmost_tag,\n"); } else { OUT("0,\t/* Use generic outmost tag fetcher */\n"); } + p = MKID_nr(expr->Identifier); if(tags_count) { OUT("asn_DEF_%s_tags,\n", p); OUT("sizeof(asn_DEF_%s_tags)\n", p); @@ -1627,3 +1636,32 @@ expr_as_xmlvaluelist(arg_t *arg, asn1p_expr_t *expr) { return 0; } } + +static int +out_identifiers_chain(arg_t *arg, int check_reserved_keywords) { + asn1p_expr_t *expr = arg->expr; + char *id; + + assert(expr->Identifier); + + if(arg->flags & A1C_DOUBLE_IDENTIFIERS + && expr->parent_expr + && expr->parent_expr->Identifier) { + arg_t tmparg = *arg; + + tmparg.expr = expr->parent_expr; + tmparg.flags &= ~A1C_DOUBLE_IDENTIFIERS; + out_identifiers_chain(&tmparg, 0); + + OUT("_"); /* a separator between id components */ + /* Fall through */ + } + + if(check_reserved_keywords) + id = MKID(expr->Identifier); + else + id = MKID_nr(expr->Identifier); + OUT("%s", id); + + return 0; +} diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index 47469511..63915359 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -13,8 +13,6 @@ static int emit_size_determination_code(arg_t *arg, asn1p_expr_type_e etype); static asn1p_expr_type_e _find_terminal_type(arg_t *arg); static int emit_range_comparison_code(arg_t *arg, asn1cnst_range_t *range, const char *varname, asn1c_integer_t natural_start, asn1c_integer_t natural_stop); -#define MKID(id) asn1c_make_identifier(0, (id), 0) - static int global_compile_mark; int diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index a1dbbd89..90377bf6 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -4,16 +4,34 @@ #include <asn1fix_export.h> /* + * Checks that the given string is not a reserved C/C++ keyword. + */ +static char *res_kwd[] = { + "char", "int", "long", + "float", "double", + "struct", "typedef", "class" }; +static int +reserved_keyword(const char *str) { + int i; + for(i = 0 ; i < sizeof(res_kwd)/sizeof(res_kwd[0]); i++) { + if(strcmp(str, res_kwd[i]) == 0) + return 1; + } + return 0; +} + +/* * Construct identifier from multiple parts. * Convert unsafe characters to underscores. */ char * -asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { +asn1c_make_identifier(enum ami_flags_e flags, char *arg1, ...) { static char *storage; static int storage_size; int nodelimiter = 0; va_list ap; char *str; + char *nextstr; int size; char *p; @@ -49,8 +67,9 @@ asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { va_start(ap, arg1); str = arg1; p = storage; - for(str = arg1; str; str = va_arg(ap, char *)) { + for(str = arg1; str; str = nextstr) { int subst_made = 0; + nextstr = va_arg(ap, char *); if(str[0] == ' ' && str[1] == '\0') { *p++ = ' '; @@ -62,12 +81,23 @@ asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { *p++ = '_'; /* Delimiter between tokens */ nodelimiter = 0; + /* + * If it is a single argument, check that it does not clash + * with C/C++ language keywords. + */ + if((flags & AMI_CHECK_RESERVED) + && str == arg1 && !nextstr && reserved_keyword(str)) { + *p++ = toupper(*str++); + /* Fall through */ + } + for(; *str; str++) { if(isalnum(*str)) { *p++ = *str; subst_made = 0; } else if(!subst_made++) { - if(unsafe_only_spaces && !isspace(*str)) { + if((flags & AMI_MASK_ONLY_SPACES) + && !isspace(*str)) { *p ++ = *str; } else { *p++ = '_'; @@ -87,6 +117,9 @@ char * asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { asn1p_expr_t *top_parent; char *typename; + enum ami_flags_e ami_flags = (_format & TNF_CHECK) + ? AMI_CHECK_RESERVED : 0; + _format &= ~TNF_CHECK; /* Rewind to the topmost parent expression */ if((top_parent = expr->parent_expr)) @@ -180,13 +213,19 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { switch(_format) { case TNF_UNMODIFIED: case TNF_INCLUDE: - return asn1c_make_identifier(1, typename, 0); + assert(ami_flags == 0); /* (TNF_INCLUDE | TNF_CHECK)?! */ + ami_flags |= AMI_MASK_ONLY_SPACES; + return asn1c_make_identifier(ami_flags, typename, 0); case TNF_SAFE: - return asn1c_make_identifier(0, typename, 0); + return asn1c_make_identifier(ami_flags, typename, 0); case TNF_CTYPE: - return asn1c_make_identifier(0, typename, "t", 0); + return asn1c_make_identifier(ami_flags, typename, "t", 0); case TNF_RSAFE: - return asn1c_make_identifier(0, "struct", " ", typename, 0); + return asn1c_make_identifier(ami_flags, "struct", " ", typename, 0); + case TNF_NORCHECK: + case TNF_CHECK: + assert(_format != TNF_NORCHECK); + assert(_format != TNF_CHECK); } assert(!"unreachable"); diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h index 325892a5..c653fa86 100644 --- a/libasn1compiler/asn1c_misc.h +++ b/libasn1compiler/asn1c_misc.h @@ -6,17 +6,23 @@ * The function will concatenate the names and replace unsafe characters * with safe ones. */ -char *asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...); +enum ami_flags_e { + AMI_MASK_ONLY_SPACES = 1, /* Mask only spaces, everything else's safe */ + AMI_CHECK_RESERVED = 2, /* Check against reserved keywords */ +}; +char *asn1c_make_identifier(enum ami_flags_e, char *arg1, ...); /* * Return the type name of the specified expression. */ enum tnfmt { - TNF_UNMODIFIED, /* Return unmodified type name */ - TNF_INCLUDE, /* Format for #include <> */ - TNF_CTYPE, /* Format as normal C-ish type (append "_t") */ - TNF_SAFE, /* Replace unsafe characters with _ */ - TNF_RSAFE, /* Recursion-safe C type format */ + TNF_NORCHECK = 0x00, + TNF_CHECK = 0x01, + TNF_UNMODIFIED = 0x10, /* Return unmodified type name */ + TNF_INCLUDE = 0x20, /* Format for #include <> */ + TNF_CTYPE = 0x30, /* Format as normal C-ish type (append "_t") */ + TNF_SAFE = 0x40, /* Replace unsafe characters with _ */ + TNF_RSAFE = 0x50, /* Recursion-safe C type format */ }; char *asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format); diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h index bd309e44..817e06c9 100644 --- a/libasn1compiler/asn1compiler.h +++ b/libasn1compiler/asn1compiler.h @@ -39,6 +39,10 @@ enum asn1c_flags { * Do not generate constraint checking code. */ A1C_NO_CONSTRAINTS = 0x0080, + /* + * Generate type_id_PR_member things identifiers of id_PR_member. + */ + A1C_DOUBLE_IDENTIFIERS = 0x0100, }; /* |