blob: dd5d049d73c335ba8d335176388b8c41ffacfeb8 [file] [log] [blame]
Lev Walkin557d1272004-10-20 15:54:02 +00001#define EMIT_ASN_DEBUG 1
2#include <OCTET_STRING.c>
3#include <BIT_STRING.c>
4#include <xer_decoder.c>
5#include <xer_support.c>
6#include <ber_decoder.c>
7#include <ber_tlv_length.c>
8#include <ber_tlv_tag.c>
9#include <der_encoder.c>
10#include <constraints.c>
11#include <sys/time.h>
12
13#define HEX 0
14#define BINARY 1
15#define UTF8 2
16
17static void
18check(int type, char *tagname, char *xmlbuf, char *verify) {
19 int xmllen = strlen(xmlbuf);
20 int verlen = verify ? strlen(verify) : 0;
21 asn_TYPE_descriptor_t *td = &asn_DEF_OCTET_STRING;
22 OCTET_STRING_t *st = 0;
23 asn_dec_rval_t rc;
24 xer_type_decoder_f *decoder = 0;
25
26 switch(type) {
27 case HEX: decoder = OCTET_STRING_decode_xer_hex; break;
28 case BINARY:
29 td = &asn_DEF_BIT_STRING;
30 decoder = OCTET_STRING_decode_xer_binary; break;
31 case UTF8: decoder = OCTET_STRING_decode_xer_utf8; break;
32 }
33
34 rc = decoder(0, td, (void **)&st, tagname, xmlbuf, xmllen);
35 printf("[%s] => [%s]:%d vs [%s]:%d, code %d\n",
36 xmlbuf,
Lev Walkincfeecfb2004-10-21 05:44:11 +000037 st ? (const char *)st->buf : "", st ? st->size : 0,
Lev Walkin6f09f692004-10-20 15:57:55 +000038 verify ? verify : "", verlen, rc.code);
Lev Walkin557d1272004-10-20 15:54:02 +000039
40 if(verify) {
41 assert(rc.code == RC_OK);
42 assert(st);
43 assert(st->buf);
44 assert(st->size == verlen);
45 assert(!memcmp(st->buf, verify, verlen));
46 } else {
47 assert(rc.code != RC_OK);
48 }
49}
50
51int
52main() {
53
54 check(HEX, 0, "<OCTET_STRING>41424</OCTET_STRING>",
55 "AB@");
56
57 check(HEX, 0, "<!--comment--><OCTET_STRING>\n"
58 "<!--comment-->41424</OCTET_STRING>",
59 "AB@");
60
61 check(HEX, 0, "<OCTET_STRING blah blah> 4 1 4 2 4 5 44 </OCTET_STRING>",
62 "ABED");
63
64 /* Some hard cases */
65 check(HEX, "z", "<z><!-- < -->40</z>", "@");
66 check(HEX, "z", "<z><!-- <-->40</z>", "@");
67 check(HEX, "z", "<z><!-- -->>40</z>", 0);
68 check(HEX, "z", "<z><!-- <some <sometag>-->40</z>", "@");
69 check(HEX, "z", "<z><!-- <some <sometag-->>40</z>", 0);
70
Lev Walkincfeecfb2004-10-21 05:44:11 +000071 check(HEX, "z", "ignored<z>40</z>stuff", "@");
72
Lev Walkin557d1272004-10-20 15:54:02 +000073 check(HEX, "tag", "<tag>4</tag>", "@");
74
75 check(BINARY, "tag", "<tag/>", "");
76 check(BINARY, "tag", "<tag>blah</tag>", 0);
77 check(BINARY, "tag", "<tag>01000001</tag>", "A");
78 check(BINARY, "tag", "<tag>01000<!--blah--> 00 101 00001</tag>", "AB");
79
80 check(UTF8, 0, "<OCTET_STRING>one, two, three</OCTET_STRING>",
81 "one, two, three");
82
Lev Walkined90f0a2004-10-23 10:16:07 +000083 check(UTF8, "z", "<z></z>", "");
Lev Walkin557d1272004-10-20 15:54:02 +000084 check(UTF8, "z", "<z z z>&lt;&amp;&gt;</z z z>", "<&>");
85 check(UTF8, "z", "<z z z>a&lt;b&amp;c&gt;d</z z z>", "a<b&c>d");
86 check(UTF8, "z", "<z z z>a&lt</z z z>", "a&lt");
87 check(UTF8, "z", "<z z z>a&sdfsdfsdf;b</z z z>", "a&sdfsdfsdf;b");
88 check(UTF8, "z", "<z z z>a&#x20;b</z z z>", "a b");
89 check(UTF8, "z", "<z z z>a&#32;b</z z z>", "a b");
90 check(UTF8, "z", "<z>a&#32323;b</z>", "a\347\271\203b");
91 check(UTF8, "z", "<z>a&#3000000000;b</z>", "a&#3000000000;b");
92 check(UTF8, "z", "<z>a&#300</z>", "a&#300");
93 check(UTF8, "z", "<z>a&#-300;</z>", "a&#-300;");
94 check(UTF8, "z", "<z>a<ff/>b</z>", "a\014b");
95 check(UTF8, "z", "<z>a<soh/>b</z>", "a\001b");
96 check(UTF8, "z", "<z>a<bel/></z>", "a\007");
97
98 return 0;
99}
100