blob: f8a79189d402073502a0b6445ca71fb0f5635334 [file] [log] [blame]
Lev Walkinf7a6c6d2004-07-21 03:55:44 +00001#undef NDEBUG
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/types.h>
5#include <string.h>
6#include <assert.h>
7#include <errno.h>
8
9#include <UserIdentifier.h>
10
11static unsigned char buf[4096];
12static int buf_offset;
13
14static int
15_buf_writer(const void *buffer, size_t size, void *app_key) {
16 unsigned char *b, *bend;
17 (void)app_key;
18 assert(buf_offset + size < sizeof(buf));
19 memcpy(buf + buf_offset, buffer, size);
20 b = buf + buf_offset;
21 bend = b + size;
22 printf("=> [");
23 for(; b < bend; b++)
24 printf(" %02X", *b);
Lev Walkin1715b322013-03-28 04:02:13 -070025 printf("]:%zd\n", size);
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000026 buf_offset += size;
27 return 0;
28}
29
30static int
Lev Walkinc7400c52004-09-29 13:14:36 +000031save_object(void *bs, asn_TYPE_descriptor_t *td) {
Lev Walkina9cc46e2004-09-22 16:06:28 +000032 asn_enc_rval_t rval; /* Return value */
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000033 int i;
34
35 rval = der_encode(td, bs, _buf_writer, 0);
36 if (rval.encoded == -1) {
37 fprintf(stderr,
38 "Cannot encode %s: %s\n",
39 rval.failed_type->name, strerror(errno));
40 assert(rval.encoded != -1);
41 return -1; /* JIC */
42 }
43
44 buf[buf_offset++] = 123; /* Finalize with garbage */
45
46 asn_fprint(stderr, td, bs);
Lev Walkina9cc46e2004-09-22 16:06:28 +000047 xer_fprint(stderr, td, bs);
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000048
49 printf("OUT: [");
50 for(i = 0; i < buf_offset; i++)
51 printf(" %02x", buf[i]);
52 printf("]\n");
53
54 return 0;
55}
56
57static int
Lev Walkinc7400c52004-09-29 13:14:36 +000058load_object(void *bs, asn_TYPE_descriptor_t *td) {
Lev Walkin90bf7ae2004-10-20 15:46:56 +000059 asn_dec_rval_t rval;
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000060
61 fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset);
62
Lev Walkinc7400c52004-09-29 13:14:36 +000063 rval = ber_decode(0, td, (void **)&bs, buf, buf_offset);
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000064 assert(rval.code == RC_OK);
65
66 asn_fprint(stderr, td, bs);
Lev Walkina9cc46e2004-09-22 16:06:28 +000067 xer_fprint(stderr, td, bs);
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000068
69 return (rval.code == RC_OK)?0:-1;
70}
71
72int
73main() {
Lev Walkinc7400c52004-09-29 13:14:36 +000074 asn_TYPE_descriptor_t *td = &asn_DEF_UserIdentifier;
Lev Walkinf7a6c6d2004-07-21 03:55:44 +000075 UserIdentifier_t user;
76 UserIdentifier_t user_new;
77 int ret;
78
79 memset(&user, 0, sizeof user);
80 memset(&user_new, 0, sizeof user_new);
81
82 user.present = UserIdentifier_PR_phoneNumber;
83 OCTET_STRING_fromBuf(
84 &user.choice.phoneNumber,
85 "0123456789", -1);
86
87 /* Save->Load must succeed */
88 save_object(&user, td);
89 ret = load_object(&user_new, td);
90
91 assert(user_new.present == UserIdentifier_PR_phoneNumber);
92
93 assert(ret == 0);
94
95 printf("OK\n");
96
97 return ret;
98}