⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asn1c_c.c

📁 RSA加密/解密算法源码 asn1c-0.9.12
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -