diff options
author | vlm <vlm@59561ff5-6e30-0410-9f3c-9617f08c8826> | 2004-10-22 08:11:25 +0000 |
---|---|---|
committer | vlm <vlm@59561ff5-6e30-0410-9f3c-9617f08c8826> | 2004-10-22 08:11:25 +0000 |
commit | 480ce97262264cdc44ec6b6e98021ab6bd2af692 (patch) | |
tree | eabe7256a59399a50e145cbea2b87b2e5ad96af8 /skeletons/BOOLEAN.c | |
parent | d52f9b5f64748a2a082871611af5447751b08e1b (diff) |
BOOLEAN XER support
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@533 59561ff5-6e30-0410-9f3c-9617f08c8826
Diffstat (limited to 'skeletons/BOOLEAN.c')
-rw-r--r-- | skeletons/BOOLEAN.c | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 61eb58ff..cfecd491 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include <asn_internal.h> +#include <asn_codecs_prim.h> #include <BOOLEAN.h> /* @@ -19,7 +20,7 @@ asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { asn_generic_no_constraint, BOOLEAN_decode_ber, BOOLEAN_encode_der, - 0, /* Not implemented yet */ + BOOLEAN_decode_xer, BOOLEAN_encode_xer, 0, /* Use generic outmost tag fetcher */ asn_DEF_BOOLEAN_tags, @@ -128,6 +129,59 @@ BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr, return erval; } + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +static ssize_t +BOOLEAN__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { + BOOLEAN_t *st = (BOOLEAN_t *)sptr; + char *p = (char *)chunk_buf; + char *pend = p + chunk_size; + + if(chunk_size == 0) return -1; + + if(p[0] == 0x3c /* '<' */) { + switch(xer_check_tag(chunk_buf, chunk_size, "false")) { + case XCT_BOTH: + /* "<false/>" */ + *st = 0; + break; + case XCT_UNEXPECTED: + if(xer_check_tag(chunk_buf, chunk_size, "true") + != XCT_BOTH) + return -1; + /* "<true/>" */ + *st = 1; /* Or 0xff as in DER?.. */ + break; + default: + return -1; + } + } else { + for(; p < pend; p++) { + switch(*p) { + case 0x09: case 0x0a: case 0x0d: case 0x20: + break; + default: + return -1; /* Not whitespace */ + } + } + } + + return chunk_size; +} + + +asn_dec_rval_t +BOOLEAN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(BOOLEAN_t), opt_mname, buf_ptr, size, + BOOLEAN__xer_body_decode); +} + asn_enc_rval_t BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, |