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

📄 constr_sequence.c

📁 RSA加密/解密算法源码 asn1c-0.9.12
💻 C
📖 第 1 页 / 共 2 页
字号:
		RETURN(RC_OK);}/* * The DER encoder of the SEQUENCE type. */asn_enc_rval_tSEQUENCE_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) {	size_t computed_size = 0;	asn_enc_rval_t erval;	ssize_t ret;	int edx;	ASN_DEBUG("%s %s as SEQUENCE",		cb?"Encoding":"Estimating", td->name);	/*	 * Gather the length of the underlying members sequence.	 */	for(edx = 0; edx < td->elements_count; edx++) {		asn_TYPE_member_t *elm = &td->elements[edx];		void *memb_ptr;		if(elm->flags & ATF_POINTER) {			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);			if(!memb_ptr) continue;		} else {			memb_ptr = (void *)((char *)ptr + elm->memb_offset);		}		erval = elm->type->der_encoder(elm->type, memb_ptr,			elm->tag_mode, elm->tag,			0, 0);		if(erval.encoded == -1)			return erval;		computed_size += erval.encoded;		ASN_DEBUG("Member %d %s estimated %ld bytes",			edx, elm->name, (long)erval.encoded);	}	/*	 * Encode the TLV for the sequence itself.	 */	ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key);	ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size);	if(ret == -1) {		erval.encoded = -1;		erval.failed_type = td;		erval.structure_ptr = ptr;		return erval;	}	erval.encoded = computed_size + ret;	if(!cb) return erval;	/*	 * Encode all members.	 */	for(edx = 0; edx < td->elements_count; edx++) {		asn_TYPE_member_t *elm = &td->elements[edx];		asn_enc_rval_t tmperval;		void *memb_ptr;		if(elm->flags & ATF_POINTER) {			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);			if(!memb_ptr) continue;		} else {			memb_ptr = (void *)((char *)ptr + elm->memb_offset);		}		tmperval = elm->type->der_encoder(elm->type, memb_ptr,			elm->tag_mode, elm->tag,			cb, app_key);		if(tmperval.encoded == -1)			return tmperval;		computed_size -= tmperval.encoded;		ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %ld bytes",			edx, elm->name, td->name, (long)tmperval.encoded);	}	if(computed_size != 0) {		/*		 * Encoded size is not equal to the computed size.		 */		erval.encoded = -1;		erval.failed_type = td;		erval.structure_ptr = ptr;	}	return erval;}#undef	XER_ADVANCE#define	XER_ADVANCE(num_bytes)	do {			\		size_t num = num_bytes;			\		buf_ptr = ((char *)buf_ptr) + num;	\		size -= num;				\		consumed_myself += num;			\	} while(0)/* * Decode the XER (XML) data. */asn_dec_rval_tSEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,	void **struct_ptr, const char *opt_mname,		void *buf_ptr, size_t size) {	/*	 * Bring closer parts of structure description.	 */	asn_SEQUENCE_specifics_t *specs		= (asn_SEQUENCE_specifics_t *)td->specifics;	asn_TYPE_member_t *elements = td->elements;	const char *xml_tag = opt_mname ? opt_mname : td->xml_tag;	/*	 * ... and parts of the structure being constructed.	 */	void *st = *struct_ptr;	/* Target structure. */	asn_struct_ctx_t *ctx;	/* Decoder context */	asn_dec_rval_t rval;		/* Return value from a decoder */	ssize_t consumed_myself = 0;	/* Consumed bytes from ptr */	int edx;			/* Element index */	int edx_end;	/*	 * Create the target structure if it is not present already.	 */	if(st == 0) {		st = *struct_ptr = CALLOC(1, specs->struct_size);		if(st == 0) RETURN(RC_FAIL);	}	/*	 * Restore parsing context.	 */	ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);	/*	 * Phases of XER/XML processing:	 * Phase 0: Check that the opening tag matches our expectations.	 * Phase 1: Processing body and reacting on closing tag.	 * Phase 2: Processing inner type.	 * Phase 3: Skipping unknown extensions.	 * Phase 4: PHASED OUT	 */	for(edx = ctx->step; ctx->phase <= 3;) {		pxer_chunk_type_e ch_type;	/* XER chunk type */		ssize_t ch_size;		/* Chunk size */		xer_check_tag_e tcv;		/* Tag check value */		asn_TYPE_member_t *elm;		int n;		/*		 * Go inside the inner member of a sequence.		 */		if(ctx->phase == 2) {			asn_dec_rval_t tmprval;			void *memb_ptr;		/* Pointer to the member */			void **memb_ptr2;	/* Pointer to that pointer */			elm = &td->elements[edx];			if(elm->flags & ATF_POINTER) {				/* Member is a pointer to another structure */				memb_ptr2 = (void **)((char *)st					+ elm->memb_offset);			} else {				memb_ptr = (char *)st + elm->memb_offset;				memb_ptr2 = &memb_ptr;			}			/* Invoke the inner type decoder, m.b. multiple times */			tmprval = elm->type->xer_decoder(opt_codec_ctx,					elm->type, memb_ptr2, elm->name,					buf_ptr, size);			XER_ADVANCE(tmprval.consumed);			if(tmprval.code != RC_OK)				RETURN(tmprval.code);			ctx->phase = 1;	/* Back to body processing */			ctx->step = ++edx;			ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d",				ctx->phase, ctx->step);			/* Fall through */		}		/*		 * Get the next part of the XML stream.		 */		ch_size = xer_next_token(&ctx->context, buf_ptr, size,			&ch_type);		switch(ch_size) {		case -1: RETURN(RC_FAIL);		case 0:  RETURN(RC_WMORE);		default:			switch(ch_type) {			case PXER_COMMENT:	/* Got XML comment */			case PXER_TEXT:		/* Ignore free-standing text */				XER_ADVANCE(ch_size);	/* Skip silently */				continue;			case PXER_TAG:				break;	/* Check the rest down there */			}		}		tcv = xer_check_tag(buf_ptr, ch_size, xml_tag);		ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d", tcv, ctx->phase);		/* Skip the extensions section */		if(ctx->phase == 3) {			switch(xer_skip_unknown(tcv, &ctx->left)) {			case -1:				ctx->phase = 4;				RETURN(RC_FAIL);			case 0:				XER_ADVANCE(ch_size);				continue;			case 1:				XER_ADVANCE(ch_size);				ctx->phase = 1;				continue;			case 2:				ctx->phase = 1;				break;			}		}		switch(tcv) {		case XCT_CLOSING:			if(ctx->phase == 0) break;			ctx->phase = 0;			/* Fall through */		case XCT_BOTH:			if(ctx->phase == 0) {				if(edx >= td->elements_count				   ||				   /* Explicit OPTIONAL specs reaches the end */				    (edx + elements[edx].optional					== td->elements_count)				   ||				   /* All extensions are optional */				   (IN_EXTENSION_GROUP(specs, edx)					&& specs->ext_before						> td->elements_count)				) {					XER_ADVANCE(ch_size);					ctx->phase = 4;	/* Phase out */					RETURN(RC_OK);				} else {					ASN_DEBUG("Premature end of XER SEQUENCE");					RETURN(RC_FAIL);				}			}			/* Fall through */		case XCT_OPENING:			if(ctx->phase == 0) {				XER_ADVANCE(ch_size);				ctx->phase = 1;	/* Processing body phase */				continue;			}			/* Fall through */		case XCT_UNKNOWN_OP:		case XCT_UNKNOWN_BO:			ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d",				tcv, ctx->phase);			if(ctx->phase != 1			|| edx >= td->elements_count)				break;	/* Really unexpected */			/*			 * Search which member corresponds to this tag.			 */			edx_end = edx + elements[edx].optional + 1;			if(edx_end > td->elements_count)				edx_end = td->elements_count;			for(n = edx; n < edx_end; n++) {				elm = &td->elements[n];				tcv = xer_check_tag(buf_ptr,ch_size,elm->name);				switch(tcv) {				case XCT_BOTH:				case XCT_OPENING:					/*					 * Process this member.					 */					ctx->step = edx = n;					ctx->phase = 2;					break;				case XCT_UNKNOWN_OP:				case XCT_UNKNOWN_BO:					continue;				default:					n = edx_end;					break;	/* Phase out */				}				break;			}			if(n != edx_end)				continue;			/* It is expected extension */			if(IN_EXTENSION_GROUP(specs,				edx + elements[edx].optional)) {				ASN_DEBUG("Got anticipated extension at %d", edx);				/*				 * Check for (XCT_BOTH or XCT_UNKNOWN_BO)				 * By using a mask. Only record a pure				 * <opening> tags.				 */				if(tcv & XCT_CLOSING) {					/* Found </extension> without body */				} else {					ctx->left = 1;					ctx->phase = 3;	/* Skip ...'s */				}				XER_ADVANCE(ch_size);				continue;			}			/* Fall through */		default:			break;		}		ASN_DEBUG("Unexpected XML tag in SEQUENCE");		break;	}	ctx->phase = 4;	/* "Phase out" on hard failure */	RETURN(RC_FAIL);}asn_enc_rval_tSEQUENCE_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;	int xcan = (flags & XER_F_CANONICAL);	int edx;	if(!sptr)		_ASN_ENCODE_FAILED;	er.encoded = 0;	for(edx = 0; edx < td->elements_count; edx++) {		asn_enc_rval_t tmper;		asn_TYPE_member_t *elm = &td->elements[edx];		void *memb_ptr;		const char *mname = elm->name;		unsigned int mlen = strlen(mname);		if(elm->flags & ATF_POINTER) {			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);			if(!memb_ptr) continue;	/* OPTIONAL element? */		} else {			memb_ptr = (void *)((char *)sptr + elm->memb_offset);		}		if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel);		_ASN_CALLBACK3("<", 1, mname, mlen, ">", 1);		/* Print the member itself */		tmper = elm->type->xer_encoder(elm->type, memb_ptr,			ilevel + 1, flags, cb, app_key);		if(tmper.encoded == -1) return tmper;		_ASN_CALLBACK3("</", 2, mname, mlen, ">", 1);		er.encoded += 5 + (2 * mlen) + tmper.encoded;	}	if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1);	return er;cb_failed:	_ASN_ENCODE_FAILED;}intSEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,		asn_app_consume_bytes_f *cb, void *app_key) {	int edx;	int ret;	if(!sptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;	/* Dump preamble */	if(cb(td->name, strlen(td->name), app_key) < 0	|| cb(" ::= {", 6, app_key) < 0)		return -1;	for(edx = 0; edx < td->elements_count; edx++) {		asn_TYPE_member_t *elm = &td->elements[edx];		const void *memb_ptr;		if(elm->flags & ATF_POINTER) {			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);			if(!memb_ptr) continue;		} else {			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);		}		/* Indentation */		_i_INDENT(1);		/* Print the member's name and stuff */		if(cb(elm->name, strlen(elm->name), app_key) < 0		|| cb(": ", 2, app_key) < 0)			return -1;		/* Print the member itself */		ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1,			cb, app_key);		if(ret) return ret;	}	ilevel--;	_i_INDENT(1);	return (cb("}", 1, app_key) < 0) ? -1 : 0;}voidSEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) {	int edx;	if(!td || !sptr)		return;	ASN_DEBUG("Freeing %s as SEQUENCE", td->name);	for(edx = 0; edx < td->elements_count; edx++) {		asn_TYPE_member_t *elm = &td->elements[edx];		void *memb_ptr;		if(elm->flags & ATF_POINTER) {			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);			if(memb_ptr)				elm->type->free_struct(elm->type, memb_ptr, 0);		} else {			memb_ptr = (void *)((char *)sptr + elm->memb_offset);			elm->type->free_struct(elm->type, memb_ptr, 1);		}	}	if(!contents_only) {		FREEMEM(sptr);	}}intSEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,		asn_app_consume_bytes_f *app_errlog, void *app_key) {	int edx;	if(!sptr) {		_ASN_ERRLOG(app_errlog, app_key,			"%s: value not given (%s:%d)",			td->name, __FILE__, __LINE__);		return -1;	}	/*	 * Iterate over structure members and check their validity.	 */	for(edx = 0; edx < td->elements_count; edx++) {		asn_TYPE_member_t *elm = &td->elements[edx];		const void *memb_ptr;		if(elm->flags & ATF_POINTER) {			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);			if(!memb_ptr) continue;		} else {			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);		}		if(elm->memb_constraints) {			int ret = elm->memb_constraints(elm->type, memb_ptr,				app_errlog, app_key);			if(ret) return ret;		} else {			int ret = elm->type->check_constraints(elm->type,				memb_ptr, app_errlog, app_key);			if(ret) return ret;			/*			 * Cannot inherit it earlier:			 * need to make sure we get the updated version.			 */			elm->memb_constraints = elm->type->check_constraints;		}	}	return 0;}

⌨️ 快捷键说明

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