Skip to content

Commit b9ba574

Browse files
author
zhengshuxin
committed
add one demo for testing split
1 parent d501547 commit b9ba574

File tree

2 files changed

+176
-0
lines changed

2 files changed

+176
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
base_path = ../../..
2+
include ../../Makefile.in
3+
PROG = split
4+
CFLAGS += -O3
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#include "lib_acl.h"
2+
#include "../stamp.h"
3+
4+
static void test1(long long max, const char *str, const char *sep)
5+
{
6+
long long i;
7+
8+
for (i = 0; i < max; i++) {
9+
ACL_ARGV *argv = acl_argv_split(str, sep);
10+
acl_argv_free(argv);
11+
}
12+
}
13+
14+
static void argv_extend(ACL_ARGV *argv)
15+
{
16+
argv->len = argv->len * 2;
17+
argv->argv = (char**) acl_myrealloc((char*) argv->argv,
18+
(argv->len + 1) * sizeof(char*));
19+
}
20+
21+
#define SPACE_LEFT(a) ((a)->len - (a)->argc - 1)
22+
23+
static ACL_ARGV *split(const char *str, const char *sep)
24+
{
25+
#if 0
26+
size_t len = strlen(str), i, start = 0;
27+
ACL_ARGV *argv = acl_argv_alloc(5);
28+
29+
for (i = 0; i < len; i++) {
30+
if (strchr(sep, str[i]) != NULL) {
31+
if (start < i) {
32+
size_t n = i - start;
33+
char *buf = (char*) acl_mymalloc(n + 1);
34+
35+
if (SPACE_LEFT(argv) <= 0) {
36+
argv_extend(argv);
37+
}
38+
memcpy(buf, str + start, n);
39+
buf[n] = 0;
40+
argv->argv[argv->argc++] = buf;
41+
}
42+
start = i + 1;
43+
}
44+
}
45+
46+
if (start < len) {
47+
size_t n = len - start;
48+
char *buf = (char*) acl_mymalloc(n + 1);
49+
50+
if (SPACE_LEFT(argv) <= 0) {
51+
argv_extend(argv);
52+
}
53+
memcpy(buf, str + start, n);
54+
buf[n] = 0;
55+
argv->argv[argv->argc++] = buf;
56+
}
57+
#else
58+
const char *ptr = str, *start = str;
59+
ACL_ARGV *argv = acl_argv_alloc(5);
60+
61+
while (*ptr != 0) {
62+
if (strchr(sep, (int) (*ptr)) != NULL) {
63+
if (start < ptr) {
64+
size_t n = ptr - start;
65+
char *buf = (char*) acl_mymalloc(n + 1);
66+
67+
if (SPACE_LEFT(argv) <= 0) {
68+
argv_extend(argv);
69+
}
70+
memcpy(buf, start, n);
71+
buf[n] = 0;
72+
argv->argv[argv->argc++] = buf;
73+
}
74+
start = ptr + 1;
75+
}
76+
ptr++;
77+
}
78+
79+
if (*start) {
80+
char *buf = (char*) acl_mystrdup(start);
81+
82+
if (SPACE_LEFT(argv) <= 0) {
83+
argv_extend(argv);
84+
}
85+
argv->argv[argv->argc++] = buf;
86+
}
87+
#endif
88+
89+
return argv;
90+
}
91+
92+
static void test2(long long max, const char *str, const char *sep)
93+
{
94+
long long i;
95+
96+
for (i = 0; i < max; i++) {
97+
ACL_ARGV *argv = split(str, sep);
98+
acl_argv_free(argv);
99+
}
100+
}
101+
102+
static void test3(const char *str, const char *sep)
103+
{
104+
ACL_ITER iter;
105+
ACL_ARGV *argv = split(str, sep);
106+
107+
acl_foreach(iter, argv) {
108+
const char *ptr = (const char*) iter.data;
109+
printf("%s\r\n", ptr);
110+
}
111+
112+
acl_argv_free(argv);
113+
}
114+
115+
static void usage(const char *procname)
116+
{
117+
printf("usage: %s -h [help]\r\n"
118+
" -n max_loop[default: 10000]\r\n"
119+
, procname);
120+
}
121+
122+
int main(int argc, char *argv[])
123+
{
124+
struct timeval begin, end;
125+
double spent, speed;
126+
int ch;
127+
long long max = 100000;
128+
const char *str = "hello world, you're welcome here! what's day is today? what's your name? How old are you? Can I help you?\r\n";
129+
const char *sep = ",;'?! \t\r\n";
130+
131+
while ((ch = getopt(argc, argv, "hn:")) > 0) {
132+
switch (ch) {
133+
case 'h':
134+
usage(argv[0]);
135+
return 0;
136+
case 'n':
137+
max = atoll(optarg);
138+
break;
139+
default:
140+
usage(argv[0]);
141+
return 0;
142+
}
143+
}
144+
145+
gettimeofday(&begin, NULL);
146+
test1(max, str, sep);
147+
gettimeofday(&end, NULL);
148+
149+
spent = stamp_sub(&end, &begin);
150+
speed = (max * 1000) / (spent >= 1.0 ? spent : 1.0);
151+
printf("loop=%lld, spent=%.2f ms, speed=%.2f\r\n", max, spent, speed);
152+
153+
/*------------------------------------------------------------------*/
154+
155+
printf("Enter any key to continue...");
156+
getchar();
157+
158+
gettimeofday(&begin, NULL);
159+
test2(max, str, sep);
160+
gettimeofday(&end, NULL);
161+
162+
spent = stamp_sub(&end, &begin);
163+
speed = (max * 1000) / (spent >= 1.0 ? spent : 1.0);
164+
printf("loop=%lld, spent=%.2f ms, speed=%.2f\r\n", max, spent, speed);
165+
166+
test3(str, sep);
167+
168+
printf("-------------------------------------------------------\r\n");
169+
test3("hello world ,;?!\t\r\n", ",;?! \t\r\n");
170+
171+
return 0;
172+
}

0 commit comments

Comments
 (0)