NativeEnumerated.c vars NULL init and check
[com/asn1c.git] / tests / tests-c-compiler / check-src / check-48.c
1 #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
11 static unsigned char buf[4096];
12 static int buf_offset;
13
14 static 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);
25         printf("]:%zd\n", size);
26         buf_offset += size;
27         return 0;
28 }
29
30 static int
31 save_object(void *bs, asn_TYPE_descriptor_t *td) {
32         asn_enc_rval_t rval; /* Return value */
33         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);
47         xer_fprint(stderr, td, bs);
48
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
57 static int
58 load_object(void *bs, asn_TYPE_descriptor_t *td) {
59         asn_dec_rval_t rval;
60
61         fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset);
62
63         rval = ber_decode(0, td, (void **)&bs, buf, buf_offset);
64         assert(rval.code == RC_OK);
65
66         asn_fprint(stderr, td, bs);
67         xer_fprint(stderr, td, bs);
68
69         return (rval.code == RC_OK)?0:-1;
70 }
71
72 int
73 main() {
74         asn_TYPE_descriptor_t *td = &asn_DEF_UserIdentifier;
75         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         ASN_STRUCT_RESET(asn_DEF_UserIdentifier, &user);
98         ASN_STRUCT_RESET(asn_DEF_UserIdentifier, &user_new);
99         return ret;
100 }