4 static int perf(int ac
, char **av
)
6 struct timeval tv1
, tv2
;
8 int fd
, i
, n
, flags1
= 0, flags2
= 0;
10 uint32_t usec1
, usec2
;
12 const char *file
= av
[0];
13 const char *pattern
= av
[1];
15 lang
= getenv("LANG");
16 if (lang
&& strcmp(lang
, "C"))
17 die("Please test it on C locale.");
19 if ((fd
= open(file
, O_RDONLY
)) == -1 || fstat(fd
, &st
))
20 die_errno("file open");
22 buffer
= xmalloc(st
.st_size
+ 2);
23 if (read(fd
, buffer
, st
.st_size
) != st
.st_size
)
26 buffer
[st
.st_size
] = '\0';
27 buffer
[st
.st_size
+ 1] = '\0';
28 for (i
= 0; i
< st
.st_size
; i
++)
29 if (buffer
[i
] == '\n')
33 if (av
[3] && !strcmp(av
[3], "pathname")) {
35 flags2
= FNM_PATHNAME
;
38 gettimeofday(&tv1
, NULL
);
39 for (i
= 0; i
< n
; i
++) {
40 for (p
= buffer
; *p
; p
+= strlen(p
) + 1)
41 wildmatch(pattern
, p
, flags1
, NULL
);
43 gettimeofday(&tv2
, NULL
);
45 usec1
= (uint32_t)tv2
.tv_sec
* 1000000 + tv2
.tv_usec
;
46 usec1
-= (uint32_t)tv1
.tv_sec
* 1000000 + tv1
.tv_usec
;
47 printf("wildmatch %ds %dus\n",
48 (int)(usec1
/ 1000000),
49 (int)(usec1
% 1000000));
51 gettimeofday(&tv1
, NULL
);
52 for (i
= 0; i
< n
; i
++) {
53 for (p
= buffer
; *p
; p
+= strlen(p
) + 1)
54 fnmatch(pattern
, p
, flags2
);
56 gettimeofday(&tv2
, NULL
);
58 usec2
= (uint32_t)tv2
.tv_sec
* 1000000 + tv2
.tv_usec
;
59 usec2
-= (uint32_t)tv1
.tv_sec
* 1000000 + tv1
.tv_usec
;
61 printf("fnmatch %ds %dus or %.2f%% slower\n",
62 (int)((usec2
- usec1
) / 1000000),
63 (int)((usec2
- usec1
) % 1000000),
64 (float)(usec2
- usec1
) / usec1
* 100);
66 printf("fnmatch %ds %dus or %.2f%% faster\n",
67 (int)((usec1
- usec2
) / 1000000),
68 (int)((usec1
- usec2
) % 1000000),
69 (float)(usec1
- usec2
) / usec1
* 100);
73 int main(int argc
, char **argv
)
77 if (!strcmp(argv
[1], "perf"))
78 return perf(argc
- 2, argv
+ 2);
80 for (i
= 2; i
< argc
; i
++) {
81 if (argv
[i
][0] == '/')
82 die("Forward slash is not allowed at the beginning of the\n"
83 "pattern because Windows does not like it. Use `XXX/' instead.");
84 else if (!strncmp(argv
[i
], "XXX/", 4))
87 if (!strcmp(argv
[1], "wildmatch"))
88 return !!wildmatch(argv
[3], argv
[2], WM_PATHNAME
, NULL
);
89 else if (!strcmp(argv
[1], "iwildmatch"))
90 return !!wildmatch(argv
[3], argv
[2], WM_PATHNAME
| WM_CASEFOLD
, NULL
);
91 else if (!strcmp(argv
[1], "pathmatch"))
92 return !!wildmatch(argv
[3], argv
[2], 0, NULL
);
93 else if (!strcmp(argv
[1], "fnmatch"))
94 return !!fnmatch(argv
[3], argv
[2], FNM_PATHNAME
);