#undef NDEBUG #include #include #include #include #include #include #include #include int main(int ac, char **av) { Programming_t p; SeqWithMandatory_t swm; SeqWithOptional_t *swo = 0; Error_t *err; asn_enc_rval_t erv; asn_dec_rval_t drv; char buf[128]; (void)ac; /* Unused argument */ (void)av; /* Unused argument */ /* * No plans to fill Programming_t up: * just checking whether it compiles or not. */ memset(&p, 0, sizeof(p)); /* * Construct a dummy sequence: * SeqWithMandatory ::= { * seqOfMan [0] EXPLICIT SEQUENCE OF Error * } */ err = calloc(1, sizeof *err); memset(&swm, 0, sizeof swm); OCTET_STRING_fromBuf(&swm.someString, "Oley", 4); ASN_SEQUENCE_ADD(&swm.seqOfMan, err); /* * Encode the sequence. */ erv = der_encode_to_buffer(&asn_DEF_SeqWithMandatory, &swm, buf, sizeof buf); assert(erv.encoded > 0); buf[erv.encoded] = '\0'; /* * Try to decode it using a compatible type. */ drv = ber_decode(0, &asn_DEF_SeqWithOptional, (void **)&swo, buf, erv.encoded); assert(drv.code == RC_OK); assert((ssize_t)drv.consumed == erv.encoded); assert(swo->seqOfOpt != 0); xer_fprint(stderr, &asn_DEF_SeqWithOptional, swo); void *tmp = swo->seqOfOpt; swo->seqOfOpt = 0; erv = der_encode_to_buffer(&asn_DEF_SeqWithOptional, swo, buf, sizeof buf); assert(erv.encoded > 0); buf[erv.encoded] = '\0'; swo->seqOfOpt = tmp; ASN_STRUCT_RESET(asn_DEF_SeqWithMandatory, &swm); ASN_STRUCT_FREE(asn_DEF_SeqWithOptional, swo); swo = 0; drv = ber_decode(0, &asn_DEF_SeqWithMandatory, (void **)&swo, buf, erv.encoded); assert(drv.code != RC_OK); ASN_STRUCT_FREE(asn_DEF_SeqWithOptional, swo); swo = 0; drv = ber_decode(0, &asn_DEF_SeqWithOptional, (void **)&swo, buf, erv.encoded); assert(drv.code == RC_OK); assert((ssize_t)drv.consumed == erv.encoded); assert(swo->seqOfOpt == 0); xer_fprint(stderr, &asn_DEF_SeqWithOptional, swo); ASN_STRUCT_FREE(asn_DEF_SeqWithOptional, swo); printf("Finished\n"); return 0; }