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

📄 constr_set_of.c

📁 RSA加密/解密算法源码 asn1c-0.9.12
💻 C
📖 第 1 页 / 共 2 页
字号:
	ret = 0;	for(edx = 0; edx < list->count; edx++) {		struct _el_buffer *encoded_el = &encoded_els[edx];		/* Report encoded chunks to the application */		if(ret == 0		&& cb(encoded_el->buf, encoded_el->length, app_key) < 0)			ret = -1;		FREEMEM(encoded_el->buf);	}	FREEMEM(encoded_els);	if(ret || computed_size != (size_t)encoding_size) {		/*		 * Standard callback failed, or		 * 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;}#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_tSET_OF_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_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics;	asn_TYPE_member_t *element = td->elements;	const char *elm_tag = ((*element->name)			? element->name : element->type->xml_tag);	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 */	/*	 * 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.	 */	for(; ctx->phase <= 2;) {		pxer_chunk_type_e ch_type;	/* XER chunk type */		ssize_t ch_size;		/* Chunk size */		xer_check_tag_e tcv;		/* Tag check value */		/*		 * Go inside the inner member of a set.		 */		if(ctx->phase == 2) {			asn_dec_rval_t tmprval;			/* Invoke the inner type decoder, m.b. multiple times */			tmprval = element->type->xer_decoder(opt_codec_ctx,					element->type, &ctx->ptr, elm_tag,					buf_ptr, size);			if(tmprval.code == RC_OK) {				A_SET_OF(void) *list;				(void *)list = (void *)st;				if(ASN_SET_ADD(list, ctx->ptr) != 0)					RETURN(RC_FAIL);				ctx->ptr = 0;				XER_ADVANCE(tmprval.consumed);			} else {				XER_ADVANCE(tmprval.consumed);				RETURN(tmprval.code);			}			ctx->phase = 1;	/* Back to body processing */			ASN_DEBUG("XER/SET OF phase => %d", ctx->phase);			/* 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/SET OF: tcv = %d, ph=%d", tcv, ctx->phase);		switch(tcv) {		case XCT_CLOSING:			if(ctx->phase == 0) break;			ctx->phase = 0;			/* Fall through */		case XCT_BOTH:			if(ctx->phase == 0) {				/* No more things to decode */				XER_ADVANCE(ch_size);				ctx->phase = 3;	/* Phase out */				RETURN(RC_OK);			}			/* 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/SET OF: tcv=%d, ph=%d", tcv, ctx->phase);			if(ctx->phase == 1) {				/*				 * Process a single possible member.				 */				ctx->phase = 2;				continue;			}			/* Fall through */		default:			break;		}		ASN_DEBUG("Unexpected XML tag in SET OF");		break;	}	ctx->phase = 3;	/* "Phase out" on hard failure */	RETURN(RC_FAIL);}typedef struct xer_tmp_enc_s {	void *buffer;	size_t offset;	size_t size;} xer_tmp_enc_t;static intSET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) {	xer_tmp_enc_t *t = (xer_tmp_enc_t *)key;	if(t->offset + size >= t->size) {		size_t newsize = (t->size << 2) + size;		void *p = REALLOC(t->buffer, newsize);		if(!p) return -1;		t->buffer = p;		t->size = newsize;	}	memcpy((char *)t->buffer + t->offset, buffer, size);	t->offset += size;	return 0;}static intSET_OF_xer_order(const void *aptr, const void *bptr) {	const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr;	const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr;	size_t minlen = a->offset;	int ret;	if(b->offset < minlen) minlen = b->offset;	/* Well-formed UTF-8 has this nice lexicographical property... */	ret = memcmp(a->buffer, b->buffer, minlen);	if(ret != 0) return ret;	if(a->offset == b->offset)		return 0;	if(a->offset == minlen)		return -1;	return 1;}asn_enc_rval_tSET_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_SET_OF(void) *list;	const char *mname = specs->as_XMLValueList		? 0 : ((*element->name)			? element->name : element->type->xml_tag);	size_t mlen = mname ? strlen(mname) : 0;	int xcan = (flags & XER_F_CANONICAL);	xer_tmp_enc_t *encs = 0;	size_t encs_count = 0;	void *original_app_key = app_key;	asn_app_consume_bytes_f *original_cb = cb;	int i;	if(!sptr) _ASN_ENCODE_FAILED;	(void *)list = sptr;	if(xcan) {		encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0]));		if(!encs) _ASN_ENCODE_FAILED;		cb = SET_OF_encode_xer_callback;	}	er.encoded = 0;	for(i = 0; i < list->count; i++) {		asn_enc_rval_t tmper;		void *memb_ptr = list->array[i];		if(!memb_ptr) continue;		if(encs) {			memset(&encs[encs_count], 0, sizeof(encs[0]));			app_key = &encs[encs_count];			encs_count++;		}		if(mname) {			if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel);			_ASN_CALLBACK3("<", 1, mname, mlen, ">", 1);		}		if(!xcan && specs->as_XMLValueList)			_i_ASN_TEXT_INDENT(1, ilevel + 1);		tmper = element->type->xer_encoder(element->type, memb_ptr,				ilevel + 1, flags, cb, app_key);		if(tmper.encoded == -1) {			td = tmper.failed_type;			sptr = tmper.structure_ptr;			goto cb_failed;		}		if(tmper.encoded == 0 && specs->as_XMLValueList) {			const char *name = (*element->name)				? element->name : element->type->xml_tag;			size_t len = strlen(name);			_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);	if(encs) {		xer_tmp_enc_t *enc = encs;		xer_tmp_enc_t *end = encs + encs_count;		ssize_t control_size = 0;		cb = original_cb;		app_key = original_app_key;		qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order);		for(; enc < end; enc++) {			_ASN_CALLBACK(enc->buffer, enc->offset);			FREEMEM(enc->buffer);			enc->buffer = 0;			control_size += enc->offset;		}		assert(control_size == er.encoded);	}	goto cleanup;cb_failed:	er.encoded = -1;	er.failed_type = td;	er.structure_ptr = sptr;cleanup:	if(encs) {		while(encs_count-- > 0) {			if(encs[encs_count].buffer)				FREEMEM(encs[encs_count].buffer);		}		free(encs);	}	return er;}intSET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,		asn_app_consume_bytes_f *cb, void *app_key) {	asn_TYPE_member_t *element = td->elements;	const A_SET_OF(void) *list;	int ret;	int i;	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;	(const void *)list = sptr;	for(i = 0; i < list->count; i++) {		const void *memb_ptr = list->array[i];		if(!memb_ptr) continue;		_i_INDENT(1);		ret = element->type->print_struct(element->type, memb_ptr,			ilevel + 1, cb, app_key);		if(ret) return ret;	}	ilevel--;	_i_INDENT(1);	return (cb("}", 1, app_key) < 0) ? -1 : 0;}voidSET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {	if(td && ptr) {		asn_TYPE_member_t *element = td->elements;		A_SET_OF(void) *list;		int i;		/*		 * Could not use set_of_empty() because of (*free)		 * incompatibility.		 */		(void *)list = ptr;		for(i = 0; i < list->count; i++) {			void *memb_ptr = list->array[i];			if(memb_ptr)			element->type->free_struct(element->type, memb_ptr, 0);		}		list->count = 0;	/* No meaningful elements left */		asn_set_empty(list);	/* Remove (list->array) */		if(!contents_only) {			FREEMEM(ptr);		}	}}intSET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr,		asn_app_consume_bytes_f *app_errlog, void *app_key) {	asn_TYPE_member_t *element = td->elements;	asn_constr_check_f *constr;	const A_SET_OF(void) *list;	int i;	if(!sptr) {		_ASN_ERRLOG(app_errlog, app_key,			"%s: value not given (%s:%d)",			td->name, __FILE__, __LINE__);		return -1;	}	(const void *)list = sptr;	constr = element->memb_constraints;	if(!constr) constr = element->type->check_constraints;	/*	 * Iterate over the members of an array.	 * Validate each in turn, until one fails.	 */	for(i = 0; i < list->count; i++) {		const void *memb_ptr = list->array[i];		int ret;		if(!memb_ptr) continue;		ret = constr(element->type, memb_ptr, app_errlog, app_key);		if(ret) return ret;	}	/*	 * Cannot inherit it eralier:	 * need to make sure we get the updated version.	 */	if(!element->memb_constraints)		element->memb_constraints = element->type->check_constraints;	return 0;}

⌨️ 快捷键说明

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