1 // Copyright (c) 1999-2018 David Muse
2 // See the file COPYING for more information
3
4 #include <rudiments/stringbuffer.h>
5 #include <rudiments/charstring.h>
6 #include <rudiments/bytestring.h>
7 #include <rudiments/stdio.h>
8 #include "test.cpp"
9
10 uint32_t iterations=5;
11 uint32_t members=1024;
12
13 char alphabet[]="abcdefghijklmnopqrstuvwxyz";
14
main(int argc,const char ** argv)15 int main(int argc, const char **argv) {
16
17 header("stringbuffer");
18
19
20 // create a new string buffer
21 stringbuffer *strb=new stringbuffer();
22 char str[800000];
23 char buf[64];
24
25 // append...
26 stdoutput.printf("append...\n");
27 for (uint16_t i=0; i<iterations; i++) {
28
29 strb->clear();
30 bytestring::zero(str,sizeof(str));
31
32 for (uint16_t j=0; j<members; j++) {
33
34 // NULL
35 strb->append((const char *)NULL);
36
37 // empty string
38 strb->append("");
39
40 // strings
41 for (uint16_t k=1; k<=25; k++) {
42 strb->append(alphabet,k);
43 charstring::append(str,alphabet,k);
44 }
45
46 // integers
47 for (uint64_t k=1; k<10000; k*=10) {
48 strb->append((uint16_t)k);
49 charstring::printf(buf,sizeof(buf),
50 "%hd",(uint16_t)k);
51 charstring::append(str,buf);
52 }
53 for (uint64_t k=1; k<1000000000; k*=10) {
54 strb->append((uint32_t)k);
55 charstring::printf(buf,sizeof(buf),
56 "%ld",(uint32_t)k);
57 charstring::append(str,buf);
58 }
59 #ifdef RUDIMENTS_HAVE_LONG_LONG
60 for (uint64_t k=1; k<1000000000000000000ULL; k*=10) {
61 strb->append((uint64_t)k);
62 charstring::printf(buf,sizeof(buf),
63 "%lld",(uint64_t)k);
64 charstring::append(str,buf);
65 }
66 #endif
67
68 // float
69 float mult=10;
70 for (uint16_t k=1; k<5; k++) {
71 float l=k+((float)k/mult);
72 mult*=10;
73 strb->append(l,k+1,(uint16_t)l);
74 charstring::printf(buf,sizeof(buf),
75 "%*.*f",k+1,k,l);
76 charstring::append(str,buf);
77 }
78
79 // double
80 mult=10;
81 for (uint16_t k=1; k<5; k++) {
82 double l=k+((double)k/mult);
83 mult*=10;
84 strb->append(l,k+1,k);
85 charstring::printf(buf,sizeof(buf),
86 "%*.*f",k+1,k,l);
87 charstring::append(str,buf);
88 }
89 }
90
91 test("length",charstring::length(str)==strb->getStringLength());
92 test("contents",!charstring::compare(str,strb->getString()));
93 }
94 stdoutput.printf("\n");
95
96
97 // setPosition and write...
98 stdoutput.printf("write...\n");
99 for (uint16_t i=0; i<iterations; i++) {
100 for (uint16_t j=0; j<10000; j++) {
101 strb->setPosition(j*(30+i));
102 strb->write("66666");
103 charstring::copy(str+(j*(30+i)),"66666",5);
104 }
105 test("contents",!charstring::compare(str,strb->getString()));
106 }
107 delete strb;
108 stdoutput.printf("\n");
109
110
111 // initial contents...
112 stdoutput.printf("initial contents...\n");
113 for (uint16_t i=0; i<iterations; i++) {
114
115 bytestring::zero(str,sizeof(str));
116
117 char *data=new char[1024*(i+1)+1];
118 bytestring::zero(data,1024*(i+1)+1);
119 for (uint16_t j=0; j<1024*(i+1)/16; j++) {
120 charstring::append(data,"0123456789abcdef");
121 charstring::append(str,"0123456789abcdef");
122 }
123
124 strb=new stringbuffer(data,charstring::length(data));
125 for (uint16_t j=0; j<=(i+1)*100; j++) {
126 strb->append("0123456789abcdef");
127 charstring::append(str,"0123456789abcdef");
128 }
129
130 test("contents",!charstring::compare(strb->getString(),str));
131 delete strb;
132 }
133 stdoutput.printf("\n");
134 }
135