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