📄 asn1c_c.c
字号:
emit_tag2member_map(arg, tag2el_cxer, tag2el_cxer_count, "_cxer"); /* * Emit a map of mandatory elements. */ OUT("static uint8_t asn_MAP_%s_%d_mmap", MKID(expr->Identifier), expr->_type_unique_index); p = MKID_safe(expr->Identifier); OUT("[(%d + (8 * sizeof(unsigned int)) - 1) / 8]", elements); OUT(" = {\n"); INDENTED( if(elements) { int delimit = 0; int el = 0; TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) continue; if(delimit) { OUT(",\n"); delimit = 0; } else if(el) { OUT(" | "); } OUT("(%d << %d)", v->marker.flags?0:1, 7 - (el % 8)); if(el && (el % 8) == 0) delimit = 1; el++; } } else { OUT("0"); } ); OUT("\n"); OUT("};\n"); OUT("static asn_SET_specifics_t asn_SPC_%s_%d_specs = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENTED( OUT("sizeof(struct "); out_name_chain(arg, 1); OUT("),\n"); OUT("offsetof(struct "); out_name_chain(arg, 1); OUT(", _asn_ctx),\n"); OUT("offsetof(struct "); out_name_chain(arg, 1); OUT(", _presence_map),\n"); p = MKID(expr->Identifier); OUT("asn_MAP_%s_%d_tag2el,\n", p, expr->_type_unique_index); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); if(tag2el_cxer) OUT("asn_MAP_%s_%d_tag2el_cxer,\n", p, expr->_type_unique_index); else OUT("asn_MAP_%s_%d_tag2el,\t/* Same as above */\n", p, expr->_type_unique_index); OUT("%d,\t/* Count of tags in the CXER map */\n", tag2el_cxer_count); OUT("%d,\t/* Whether extensible */\n", check_if_extensible(expr)); OUT("(unsigned int *)asn_MAP_%s_%d_mmap\t/* Mandatory elements map */\n", p, expr->_type_unique_index); ); OUT("};\n"); /* * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); return 0;} /* _SET_def() */intasn1c_lang_C_type_SEx_OF(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *memb = TQ_FIRST(&expr->members); DEPENDENCIES; if(arg->embed) { OUT("struct "); out_name_chain(arg, 1); OUT(" {\n"); } else { OUT("typedef struct %s {\n", MKID_safe(expr->Identifier)); } INDENT(+1); OUT("A_%s_OF(", (arg->expr->expr_type == ASN_CONSTR_SET_OF) ? "SET" : "SEQUENCE"); if(memb->expr_type & ASN_CONSTR_MASK || ((memb->expr_type == ASN_BASIC_ENUMERATED || (0 /* -- prohibited by X.693:8.3.4 */ && memb->expr_type == ASN_BASIC_INTEGER)) && expr_elements_count(arg, memb))) { arg_t tmp; asn1p_expr_t tmp_memb; arg->embed++; tmp = *arg; tmp.expr = &tmp_memb; tmp_memb = *memb; tmp_memb._anonymous_type = 1; if(tmp_memb.Identifier == 0) { tmp_memb.Identifier = "Member"; if(0) tmp_memb.Identifier = strdup( asn1c_make_identifier(0, expr->Identifier, "Member", 0)); assert(tmp_memb.Identifier); } tmp.default_cb(&tmp); if(tmp_memb.Identifier != memb->Identifier) if(0) free(tmp_memb.Identifier); arg->embed--; assert(arg->target->target == OT_TYPE_DECLS); } else { OUT("%s", asn1c_type_name(arg, memb, (memb->marker.flags & EM_UNRECURSE) ? TNF_RSAFE : TNF_CTYPE)); } OUT(") list;\n"); INDENT(-1); PCTX_DEF; OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", expr->_anonymous_type ? "" : MKID_safe(expr->Identifier), arg->embed ? "" : "_t"); /* * SET OF/SEQUENCE OF definition */ return asn1c_lang_C_type_SEx_OF_def(arg, (arg->expr->expr_type == ASN_CONSTR_SEQUENCE_OF));}static intasn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int tags_count; int all_tags_count; enum tvm_compat tv_mode; /* * Print out the table according to which the parsing is performed. */ if(seq_of) { GEN_INCLUDE("constr_SEQUENCE_OF"); } else { GEN_INCLUDE("constr_SET_OF"); } if(!arg->embed) GEN_DECLARE(expr); /* asn_DEF_xxx */ REDIR(OT_STAT_DEFS); /* * Print out the table according to which the parsing is performed. */ OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENT(+1); v = TQ_FIRST(&(expr->members)); if(!v->Identifier) { v->Identifier = strdup("Member"); assert(v->Identifier); } v->_anonymous_type = 1; arg->embed++; emit_member_table(arg, v); arg->embed--; INDENT(-1); OUT("};\n"); /* * Print out asn_DEF_<type>_[all_]tags[] vectors. */ tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); OUT("static asn_SET_OF_specifics_t asn_SPC_%s_%d_specs = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENTED( OUT("sizeof(struct "); out_name_chain(arg, 1); OUT("),\n"); OUT("offsetof(struct "); out_name_chain(arg, 1); OUT(", _asn_ctx),\n"); if(expr_as_xmlvaluelist(arg, v)) OUT("1,\t/* XER encoding is XMLValueList */\n"); else OUT("0,\t/* XER encoding is XMLDelimitedItemList */\n"); ); OUT("};\n"); /* * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); return 0;} /* _SEx_OF_def() */intasn1c_lang_C_type_CHOICE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; char *id; DEPENDENCIES; REDIR(OT_DEPS); OUT("typedef enum "); out_name_chain(arg, 0); OUT("_PR {\n"); INDENTED( out_name_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; } out_name_chain(arg, 0); OUT("_PR_"); id = MKID(v->Identifier); OUT("%s,\n", id, id); } ); OUT("} "); out_name_chain(arg, 0); OUT("_PR;\n"); REDIR(OT_TYPE_DECLS); if(arg->embed) { OUT("struct "); out_name_chain(arg, 1); OUT(" {\n"); } else { OUT("typedef struct %s {\n", MKID_safe(expr->Identifier)); } INDENTED( out_name_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; EMBED(v); } if(UNNAMED_UNIONS) OUT("};\n"); else OUT("} choice;\n"); ); PCTX_DEF; OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", expr->_anonymous_type ? "" : arg->embed ? MKID_safe(expr->Identifier) : MKID(expr->Identifier), arg->embed ? "" : "_t"); return asn1c_lang_C_type_CHOICE_def(arg);}static intasn1c_lang_C_type_CHOICE_def(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int elements; /* Number of elements */ tag2el_t *tag2el = NULL; int tag2el_count = 0; int tags_count; int all_tags_count; enum tvm_compat tv_mode; /* * Fetch every inner tag from the tag to elements map. */ if(_fill_tag2el_map(arg, &tag2el, &tag2el_count, -1, FTE_ALLTAGS)) { if(tag2el) free(tag2el); return -1; } GEN_INCLUDE("constr_CHOICE"); if(!arg->embed) GEN_DECLARE(expr); /* asn_DEF_xxx */ REDIR(OT_STAT_DEFS); /* * Print out the table according to which the parsing is performed. */ if(expr_elements_count(arg, expr)) { OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr->Identifier), expr->_type_unique_index); elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) continue; if(expr_better_indirect(arg, v)) v->marker.flags |= EM_INDIRECT; elements++; emit_member_table(arg, v); }); OUT("};\n"); } else { elements = 0; } if(arg->embed) { /* * Our parent structure has already taken this into account. */ tv_mode = _TVM_SAME; tags_count = all_tags_count = 0; } else { tv_mode = emit_tags_vectors(arg, expr, &tags_count, &all_tags_count); } /* * Tags to elements map. */ emit_tag2member_map(arg, tag2el, tag2el_count, 0); OUT("static asn_CHOICE_specifics_t asn_SPC_%s_%d_specs = {\n", MKID(expr->Identifier), expr->_type_unique_index); INDENTED( OUT("sizeof(struct "); out_name_chain(arg, 1); OUT("),\n"); OUT("offsetof(struct "); out_name_chain(arg, 1); OUT(", _asn_ctx),\n"); OUT("offsetof(struct "); out_name_chain(arg, 1); OUT(", present),\n"); OUT("sizeof(((struct "); out_name_chain(arg, 1); OUT(" *)0)->present),\n"); OUT("asn_MAP_%s_%d_tag2el,\n", MKID(expr->Identifier), expr->_type_unique_index); OUT("%d,\t/* Count of tags in the map */\n", tag2el_count); OUT("%d\t/* Whether extensible */\n", check_if_extensible(expr)); ); OUT("};\n"); /* * Emit asn_DEF_xxx table. */ emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); REDIR(OT_TYPE_DECLS); return 0;} /* _CHOICE_def() */intasn1c_lang_C_type_REFERENCE(arg_t *arg) { asn1p_ref_t *ref; ref = arg->expr->reference; if(ref->components[ref->comp_count-1].name[0] == '&') { asn1p_expr_t *extract; arg_t tmp; int ret; extract = asn1f_class_access_ex(arg->asn, arg->expr->module, arg->expr, ref); if(extract == NULL) return -1; extract = asn1p_expr_clone(extract, 0); if(extract) { if(extract->Identifier) free(extract->Identifier); extract->Identifier = strdup(arg->expr->Identifier); if(extract->Identifier == NULL) { asn1p_expr_free(extract); return -1; } } else { return -1; } tmp = *arg; tmp.asn = arg->asn; tmp.mod = extract->module; tmp.expr = extract; ret = arg->default_cb(&tmp); asn1p_expr_free(extract); return ret; } return asn1c_lang_C_type_SIMPLE_TYPE(arg);}intasn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; int tags_count; int all_tags_count; enum tvm_compat tv_mode; enum etd_spec etd_spec; char *p; if(arg->embed) { enum tnfmt tnfmt = TNF_CTYPE; /* * If this is an optional compound type, * refer it using "struct X" convention, * as it may recursively include the current structure. */ if(expr->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) { asn1p_expr_t *terminal; terminal = asn1f_find_terminal_type_ex(arg->asn, expr); if(terminal && (terminal->expr_type & ASN_CONSTR_MASK)) { tnfmt = TNF_RSAFE; REDIR(OT_FWD_DECLS); OUT("%s;\n", asn1c_type_name(arg, arg->expr, tnfmt)); } } REDIR(OT_TYPE_DECLS); OUT("%s", asn1c_type_name(arg, arg->expr, tnfmt)); if(!expr->_anonymous_type) { OUT("%s", (expr->marker.flags&EM_INDIRECT)?"\t*":"\t "); OUT("%s", MKID_safe(expr->Identifier)); if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT) OUT("\t/* DEFAULT %s */", asn1f_printable_value( expr->marker.default_value)); else if((expr->marker.flags & EM_OPTIONAL) == EM_OPTIONAL) OUT("\t/* OPTIONAL */"); } } else { GEN_INCLUDE(asn1c_type_name(arg, expr, TNF_INCLUDE)); REDIR(OT_TYPE_DECLS); OUT("typedef %s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE)); OUT("%s%s_t", (expr->marker.flags & EM_INDIRECT)?"*":" ", MKID(expr->Identifier)); } if((expr->expr_type == ASN_BASIC_ENUMERATED) || (0 /* -- prohibited by X.693:8.3.4 */ && expr->expr_type == ASN_BASIC_INTEGER && expr_elements_count(arg, expr))) etd_spec = ETD_HAS_SPECIFICS; else etd_spec = ETD_NO_SPECIFICS; /* * If this type just blindly refers the other type, alias it. * Type1 ::= Type2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -