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

📄 constr_sequence_of.c

📁 RSA加密/解密算法源码 asn1c-0.9.12
💻 C
字号:
/*- * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */#include <asn_internal.h>#include <constr_SEQUENCE_OF.h>#include <asn_SEQUENCE_OF.h>/* * The DER encoder of the SEQUENCE OF type. */asn_enc_rval_tSEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr,	int tag_mode, ber_tlv_tag_t tag,	asn_app_consume_bytes_f *cb, void *app_key) {	asn_TYPE_member_t *elm = td->elements;	A_SEQUENCE_OF(void) *list;	size_t computed_size = 0;	ssize_t encoding_size = 0;	asn_enc_rval_t erval;	int edx;	ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name);	/*	 * Gather the length of the underlying members sequence.	 */	(void *)list = ptr;	for(edx = 0; edx < list->count; edx++) {		void *memb_ptr = list->array[edx];		erval = elm->type->der_encoder(elm->type, memb_ptr,			0, elm->tag,			0, 0);		if(erval.encoded == -1)			return erval;		computed_size += erval.encoded;	}	/*	 * Encode the TLV for the sequence itself.	 */	encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag,		cb, app_key);	if(encoding_size == -1) {		erval.encoded = -1;		erval.failed_type = td;		erval.structure_ptr = ptr;		return erval;	}	computed_size += encoding_size;	if(!cb) {		erval.encoded = computed_size;		return erval;	}	ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name);	/*	 * Encode all members.	 */	for(edx = 0; edx < list->count; edx++) {		void *memb_ptr = list->array[edx];		erval = elm->type->der_encoder(elm->type, memb_ptr,			0, elm->tag,			cb, app_key);		if(erval.encoded == -1)			return erval;		encoding_size += erval.encoded;	}	if(computed_size != (size_t)encoding_size) {		/*		 * Encoded size is not equal to the computed size.		 */		erval.encoded = -1;		erval.failed_type = td;		erval.structure_ptr = ptr;	} else {		erval.encoded = computed_size;	}	return erval;}asn_enc_rval_tSEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,	int ilevel, enum xer_encoder_flags_e flags,		asn_app_consume_bytes_f *cb, void *app_key) {	asn_enc_rval_t er;        asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics;	asn_TYPE_member_t *element = td->elements;	A_SEQUENCE_OF(void) *list;	const char *mname = specs->as_XMLValueList		? 0 : ((*element->name)			? element->name : element->type->xml_tag);	unsigned int mlen = mname ? strlen(mname) : 0;	int xcan = (flags & XER_F_CANONICAL);	int i;	if(!sptr) _ASN_ENCODE_FAILED;	er.encoded = 0;	(void *)list = sptr;	for(i = 0; i < list->count; i++) {		asn_enc_rval_t tmper;		void *memb_ptr = list->array[i];		if(!memb_ptr) continue;		if(mname) {			if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel);			_ASN_CALLBACK3("<", 1, mname, mlen, ">", 1);		}		tmper = element->type->xer_encoder(element->type, memb_ptr,				ilevel + 1, flags, cb, app_key);		if(tmper.encoded == -1) return tmper;                if(tmper.encoded == 0 && specs->as_XMLValueList) {                        const char *name = (*element->name)                                ? element->name : element->type->xml_tag;			size_t len = strlen(name);			if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel + 1);			_ASN_CALLBACK3("<", 1, name, len, "/>", 2);                }		if(mname) {			_ASN_CALLBACK3("</", 2, mname, mlen, ">", 1);			er.encoded += 5;		}		er.encoded += (2 * mlen) + tmper.encoded;	}	if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1);	return er;cb_failed:	_ASN_ENCODE_FAILED;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -