blob: 1497921915fc9de8eded218be8182f0529f955be [file] [log] [blame]
vlmc35d34a2004-10-02 11:37:09 +00001#include <UTF8String.c>
2#include <OCTET_STRING.c>
3#include <ber_decoder.c>
4#include <ber_tlv_length.c>
5#include <ber_tlv_tag.c>
6#include <der_encoder.c>
7#include <constraints.c>
8#include <sys/time.h>
9
10static void
11check(int expect_length, char *buf, int buflen) {
12 UTF8String_t st;
13 int ret;
14
15 if(buflen < 0) buflen = strlen(buf);
16
17 st.buf = (uint8_t *)buf;
18 st.size = buflen;
19 printf("[");
20
21 for(ret = 0; ret < buflen; ret++)
22 printf("%c", buf[ret]);
vlmd295c1c2004-10-02 15:54:09 +000023 ret = UTF8String_length(&st);
vlmc35d34a2004-10-02 11:37:09 +000024 printf("]: size=%d, expect=%d, got=%d\n",
25 buflen, expect_length, ret);
26 assert(ret == expect_length);
27}
28
29static int
30check_speed() {
31 int cycles = 1000000;
32 double start, stop;
33 struct timeval tv;
34 UTF8String_t st;
35 char long_test[] =
36 "a\303\237a\303\237a\303\237a\303\237"
37 "a\303\237a\303\237a\303\237a\303\237"
38 "a\303\237a\303\237a\303\237a\303\237"
39 "a\303\237a\303\237a\303\237a\303\237"
40 "a\303\237a\303\237a\303\237a\303\237";
41 int ret;
42 int i;
43
44 st.buf = long_test;
45 st.size = sizeof(long_test) - 1;
46
vlmd295c1c2004-10-02 15:54:09 +000047 ret = UTF8String_length(&st);
vlmc35d34a2004-10-02 11:37:09 +000048 assert(ret == 40);
49 printf("Now wait a bit...\n");
50
51 gettimeofday(&tv, 0);
52 start = tv.tv_sec + tv.tv_usec / 1000000.0;
53 for(i = 0; i < cycles; i++) {
vlmd295c1c2004-10-02 15:54:09 +000054 ret += UTF8String_length(&st);
vlmc35d34a2004-10-02 11:37:09 +000055 }
56 gettimeofday(&tv, 0);
57 stop = tv.tv_sec + tv.tv_usec / 1000000.0;
58
59 printf("%d cycles in %.3fms\n", cycles, stop - start);
60
61 return ret;
62}
63
64int
65main() {
66
67 check(0, "", 0);
68 check(1, "\0", 1);
vlmc35d34a2004-10-02 11:37:09 +000069 check(1, "a", 1);
70 check(2, "ab", 2);
71 check(3, "abc", 3);
72 assert(sizeof("a\303\237cd") == 6);
73 check(4, "a\303\237cd", 5);
vlmd295c1c2004-10-02 15:54:09 +000074 check(3, "a\370\211\200\201\257c", 7);
75 check(3, "\320\273\320\265\320\262", 6);
76
77 check(-1, "a\303", 2); /* Truncated */
78 check(-2, "\377", 1); /* Invalid UTF-8 sequence start */
79 check(-2, "\200", 1);
80 check(-2, "\320\273\265\320\262", 5);
81 check(-3, "\320c", 2); /* Not continuation */
82 check(-3, "a\370\200\200\200c", 6);
83 check(-4, "a\370\200\200\200\257c", 7);
84 check(-4, "\320\273\320\265\340\200\262", 7);
85 check(-5, 0, 0);
vlmc35d34a2004-10-02 11:37:09 +000086
87 check_speed();
88
89 return 0;
90}
91