xref: /netbsd-src/external/bsd/tre/dist/tests/bench.c (revision 63d4abf06d37aace2f9e41a494102a64fe3abddb)
1*63d4abf0Sagc /*
2*63d4abf0Sagc   bench.c - simple regex benchmark program
3*63d4abf0Sagc 
4*63d4abf0Sagc   This software is released under a BSD-style license.
5*63d4abf0Sagc   See the file LICENSE for details and copyright.
6*63d4abf0Sagc 
7*63d4abf0Sagc */
8*63d4abf0Sagc 
9*63d4abf0Sagc #ifdef HAVE_CONFIG_H
10*63d4abf0Sagc #include <config.h>
11*63d4abf0Sagc #endif /* HAVE_CONFIG_H */
12*63d4abf0Sagc 
13*63d4abf0Sagc #include <stdio.h>
14*63d4abf0Sagc #include <stdlib.h>
15*63d4abf0Sagc #ifdef HAVE_GETOPT_H
16*63d4abf0Sagc #include <getopt.h>
17*63d4abf0Sagc #endif /* HAVE_GETOPT_H */
18*63d4abf0Sagc #include <time.h>
19*63d4abf0Sagc #include <unistd.h>
20*63d4abf0Sagc #include <math.h>
21*63d4abf0Sagc #include <sys/types.h>
22*63d4abf0Sagc 
23*63d4abf0Sagc #if 0
24*63d4abf0Sagc #include <hackerlab/rx-posix/regex.h>
25*63d4abf0Sagc #else
26*63d4abf0Sagc #include <regex.h>
27*63d4abf0Sagc #endif
28*63d4abf0Sagc 
29*63d4abf0Sagc /* T distribution for alpha = 0.025 (for 95% confidence).  XXX - is
30*63d4abf0Sagc    this correct? */
31*63d4abf0Sagc double t_distribution[] = {
32*63d4abf0Sagc   12.71,
33*63d4abf0Sagc   4.303,
34*63d4abf0Sagc   3.182,
35*63d4abf0Sagc   2.776,
36*63d4abf0Sagc   2.571,
37*63d4abf0Sagc   2.447,
38*63d4abf0Sagc   2.365,
39*63d4abf0Sagc   2.306,
40*63d4abf0Sagc   2.262,
41*63d4abf0Sagc   2.228,
42*63d4abf0Sagc   2.201,
43*63d4abf0Sagc   2.179,
44*63d4abf0Sagc   2.160,
45*63d4abf0Sagc   2.145,
46*63d4abf0Sagc   2.131,
47*63d4abf0Sagc   2.120,
48*63d4abf0Sagc   2.110,
49*63d4abf0Sagc   2.101,
50*63d4abf0Sagc   2.093,
51*63d4abf0Sagc   2.086,
52*63d4abf0Sagc   2.080,
53*63d4abf0Sagc   2.074,
54*63d4abf0Sagc   2.069,
55*63d4abf0Sagc   2.064,
56*63d4abf0Sagc   2.060,
57*63d4abf0Sagc   2.056,
58*63d4abf0Sagc   2.052,
59*63d4abf0Sagc   2.048,
60*63d4abf0Sagc   2.045,
61*63d4abf0Sagc   2.042
62*63d4abf0Sagc };
63*63d4abf0Sagc 
64*63d4abf0Sagc void
stats(double * sample_data,int samples,int len)65*63d4abf0Sagc stats(double *sample_data, int samples, int len)
66*63d4abf0Sagc {
67*63d4abf0Sagc   double mean, tmp1, tmp2, variance, stddev, error, percent;
68*63d4abf0Sagc   int i;
69*63d4abf0Sagc 
70*63d4abf0Sagc   mean = 0;
71*63d4abf0Sagc   for (i = 0; i < samples; i++)
72*63d4abf0Sagc     mean += sample_data[i];
73*63d4abf0Sagc   mean = mean/i;
74*63d4abf0Sagc   printf("# mean: %.5f\n", mean);
75*63d4abf0Sagc 
76*63d4abf0Sagc   tmp1 = 0;
77*63d4abf0Sagc   for (i = 0; i < samples; i++) {
78*63d4abf0Sagc     tmp2 = sample_data[i] - mean;
79*63d4abf0Sagc     tmp1 += tmp2*tmp2;
80*63d4abf0Sagc   }
81*63d4abf0Sagc   if (samples > 1)
82*63d4abf0Sagc     variance = tmp1 / (samples-1);
83*63d4abf0Sagc   else
84*63d4abf0Sagc     variance = 0;
85*63d4abf0Sagc   stddev = sqrt(variance);
86*63d4abf0Sagc   printf("# variance: %.16f\n", variance);
87*63d4abf0Sagc   printf("# standard deviation: %.16f\n", stddev);
88*63d4abf0Sagc 
89*63d4abf0Sagc   error = t_distribution[samples-1] * stddev / sqrt(samples);
90*63d4abf0Sagc   if (mean != 0)
91*63d4abf0Sagc     percent = 100*error/mean;
92*63d4abf0Sagc   else
93*63d4abf0Sagc     percent = 0;
94*63d4abf0Sagc   printf("# error: �%.16f (�%.4f%%)\n", error, percent);
95*63d4abf0Sagc 
96*63d4abf0Sagc   printf("%d\t%.5f\t%.5f\n", len, mean, error);
97*63d4abf0Sagc 
98*63d4abf0Sagc   fflush(stdout);
99*63d4abf0Sagc }
100*63d4abf0Sagc 
101*63d4abf0Sagc void
run_tests(int len,int samples,double * sample_data,int repeats,regex_t * reobj,char * str,char * tmpbuf)102*63d4abf0Sagc run_tests(int len, int samples, double *sample_data, int repeats,
103*63d4abf0Sagc 	  regex_t *reobj, char *str, char *tmpbuf)
104*63d4abf0Sagc {
105*63d4abf0Sagc   int i, j, errcode;
106*63d4abf0Sagc   clock_t c1, c2;
107*63d4abf0Sagc   regmatch_t pmatch[10];
108*63d4abf0Sagc 
109*63d4abf0Sagc 
110*63d4abf0Sagc   printf("# len = %d\n", len);
111*63d4abf0Sagc   fflush(stdout);
112*63d4abf0Sagc   for (i = 0; i < samples; i++) {
113*63d4abf0Sagc     c1 = clock();
114*63d4abf0Sagc     for (j = 0; j < repeats; j++)
115*63d4abf0Sagc       if ((errcode = tre_regexec(reobj, str, 10, pmatch, 0))) {
116*63d4abf0Sagc 	tre_regerror(errcode, reobj, tmpbuf, 255);
117*63d4abf0Sagc 	printf("error: %s\n", tmpbuf);
118*63d4abf0Sagc       }
119*63d4abf0Sagc     c2 = clock();
120*63d4abf0Sagc 
121*63d4abf0Sagc     sample_data[i] = (double)(c2-c1)/(CLOCKS_PER_SEC*repeats);
122*63d4abf0Sagc 
123*63d4abf0Sagc     printf("# sample: %.5f sec, clocks: %ld\n",
124*63d4abf0Sagc 	   (double)(c2-c1)/(CLOCKS_PER_SEC*repeats),
125*63d4abf0Sagc 	   (long)(c2-c1));
126*63d4abf0Sagc     fflush(stdout);
127*63d4abf0Sagc   }
128*63d4abf0Sagc   fflush(stdout);
129*63d4abf0Sagc 
130*63d4abf0Sagc   for (i = 0; i < 10; i += 2) {
131*63d4abf0Sagc     printf("# pmatch[%d].rm_so = %d\n", i/2, (int)pmatch[i/2].rm_so);
132*63d4abf0Sagc     printf("# pmatch[%d].rm_eo = %d\n", i/2, (int)pmatch[i/2].rm_eo);
133*63d4abf0Sagc   }
134*63d4abf0Sagc }
135*63d4abf0Sagc 
136*63d4abf0Sagc 
137*63d4abf0Sagc int
main(int argc,char ** argv)138*63d4abf0Sagc main(int argc, char **argv)
139*63d4abf0Sagc {
140*63d4abf0Sagc   regex_t reobj;
141*63d4abf0Sagc   char *str;
142*63d4abf0Sagc   char tmpbuf[256];
143*63d4abf0Sagc   int i, j;
144*63d4abf0Sagc   int max_len = 1024*1024*10;
145*63d4abf0Sagc   int steps = 20;
146*63d4abf0Sagc   int repeats = 10;
147*63d4abf0Sagc   int samples = 20;
148*63d4abf0Sagc   int len;
149*63d4abf0Sagc   clock_t c1, c2;
150*63d4abf0Sagc   int opt;
151*63d4abf0Sagc   double sample_data[30];
152*63d4abf0Sagc 
153*63d4abf0Sagc   int test_id = -1;
154*63d4abf0Sagc 
155*63d4abf0Sagc   while ((opt = getopt(argc, argv, "r:l:s:j:t:")) != -1) {
156*63d4abf0Sagc     switch (opt) {
157*63d4abf0Sagc     case 't':
158*63d4abf0Sagc       test_id = atoi(optarg);
159*63d4abf0Sagc       break;
160*63d4abf0Sagc     case 'l':
161*63d4abf0Sagc       max_len = atoi(optarg);
162*63d4abf0Sagc       break;
163*63d4abf0Sagc     case 'j':
164*63d4abf0Sagc       steps = atoi(optarg);
165*63d4abf0Sagc       break;
166*63d4abf0Sagc     case 's':
167*63d4abf0Sagc       samples = atoi(optarg);
168*63d4abf0Sagc       break;
169*63d4abf0Sagc     case 'r':
170*63d4abf0Sagc       repeats = atoi(optarg);
171*63d4abf0Sagc       break;
172*63d4abf0Sagc     default:
173*63d4abf0Sagc       printf("P�lli.\n");
174*63d4abf0Sagc       return 1;
175*63d4abf0Sagc     }
176*63d4abf0Sagc   }
177*63d4abf0Sagc 
178*63d4abf0Sagc   /* XXX - Check that the correct results are returned.  For example, GNU
179*63d4abf0Sagc            regex-0.12 returns incorrect results for very long strings in
180*63d4abf0Sagc 	   test number 1. */
181*63d4abf0Sagc 
182*63d4abf0Sagc   switch (test_id) {
183*63d4abf0Sagc   case 0:
184*63d4abf0Sagc     printf("# pattern: \"a*\"\n");
185*63d4abf0Sagc     printf("# string:  \"aaaaaa...\"\n");
186*63d4abf0Sagc     len = 0;
187*63d4abf0Sagc     tre_regcomp(&reobj, "a*", REG_EXTENDED);
188*63d4abf0Sagc     while (len <= max_len) {
189*63d4abf0Sagc 
190*63d4abf0Sagc       str = malloc(sizeof(char) * (len+1));
191*63d4abf0Sagc       for (i = 0; i < len; i++)
192*63d4abf0Sagc 	str[i] = 'a';
193*63d4abf0Sagc       str[len-1] = '\0';
194*63d4abf0Sagc 
195*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
196*63d4abf0Sagc       stats(sample_data, samples, len);
197*63d4abf0Sagc       len = len + (max_len/steps);
198*63d4abf0Sagc       free(str);
199*63d4abf0Sagc     }
200*63d4abf0Sagc     break;
201*63d4abf0Sagc 
202*63d4abf0Sagc 
203*63d4abf0Sagc   case 1:
204*63d4abf0Sagc     printf("# pattern: \"(a)*\"\n");
205*63d4abf0Sagc     printf("# string:  \"aaaaaa...\"\n");
206*63d4abf0Sagc     len = 0;
207*63d4abf0Sagc     tre_regcomp(&reobj, "(a)*", REG_EXTENDED);
208*63d4abf0Sagc     while (len <= max_len) {
209*63d4abf0Sagc 
210*63d4abf0Sagc       str = malloc(sizeof(char) * (len+1));
211*63d4abf0Sagc       for (i = 0; i < len; i++)
212*63d4abf0Sagc 	str[i] = 'a';
213*63d4abf0Sagc       str[len-1] = '\0';
214*63d4abf0Sagc 
215*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
216*63d4abf0Sagc       stats(sample_data, samples, len);
217*63d4abf0Sagc       len = len + (max_len/steps);
218*63d4abf0Sagc       free(str);
219*63d4abf0Sagc     }
220*63d4abf0Sagc     break;
221*63d4abf0Sagc 
222*63d4abf0Sagc 
223*63d4abf0Sagc   case 2:
224*63d4abf0Sagc     printf("# pattern: \"(a*)\"\n");
225*63d4abf0Sagc     printf("# string:  \"aaaaaa...\"\n");    len = 0;
226*63d4abf0Sagc     tre_regcomp(&reobj, "(a*)", REG_EXTENDED);
227*63d4abf0Sagc     while (len <= max_len) {
228*63d4abf0Sagc 
229*63d4abf0Sagc       str = malloc(sizeof(char) * (len+1));
230*63d4abf0Sagc       for (i = 0; i < len; i++)
231*63d4abf0Sagc 	str[i] = 'a';
232*63d4abf0Sagc       str[len-1] = '\0';
233*63d4abf0Sagc 
234*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
235*63d4abf0Sagc       stats(sample_data, samples, len);
236*63d4abf0Sagc       len = len + (max_len/steps);
237*63d4abf0Sagc       free(str);
238*63d4abf0Sagc     }
239*63d4abf0Sagc     break;
240*63d4abf0Sagc 
241*63d4abf0Sagc   case 3:
242*63d4abf0Sagc     printf("# pattern: \"(a*)*|b*\"\n");
243*63d4abf0Sagc     printf("# string:  \"aaaaaa...b\"\n");
244*63d4abf0Sagc     len = 0;
245*63d4abf0Sagc     tre_regcomp(&reobj, "(a*)*|b*", REG_EXTENDED);
246*63d4abf0Sagc     while (len <= max_len) {
247*63d4abf0Sagc       str = malloc(sizeof(char) * (len+1));
248*63d4abf0Sagc       for (i = 0; i < len-1; i++)
249*63d4abf0Sagc 	str[i] = 'a';
250*63d4abf0Sagc       if (len > 0)
251*63d4abf0Sagc 	str[len-1] = 'b';
252*63d4abf0Sagc       str[len] = '\0';
253*63d4abf0Sagc 
254*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
255*63d4abf0Sagc       stats(sample_data, samples, len);
256*63d4abf0Sagc       len = len + (max_len/steps);
257*63d4abf0Sagc       free(str);
258*63d4abf0Sagc     }
259*63d4abf0Sagc     break;
260*63d4abf0Sagc 
261*63d4abf0Sagc   case 4:
262*63d4abf0Sagc     printf("# pattern: \"(a|a|a|...|a)\"\n");
263*63d4abf0Sagc     printf("# string:  \"aaaaaa...\"\n");
264*63d4abf0Sagc     len = 1024*1024;
265*63d4abf0Sagc     str = malloc(sizeof(char) * (len+1));
266*63d4abf0Sagc     for (i = 0; i < len-1; i++)
267*63d4abf0Sagc       str[i] = 'a';
268*63d4abf0Sagc     str[len] = '\0';
269*63d4abf0Sagc     len = 0;
270*63d4abf0Sagc     while (len <= max_len) {
271*63d4abf0Sagc       tmpbuf[0] = '(';
272*63d4abf0Sagc       for (i = 1; i < (len*2); i++) {
273*63d4abf0Sagc 	tmpbuf[i] = 'a';
274*63d4abf0Sagc 	if (i < len*2-2) {
275*63d4abf0Sagc 	  i++;
276*63d4abf0Sagc 	  tmpbuf[i] = '|';
277*63d4abf0Sagc 	}
278*63d4abf0Sagc       }
279*63d4abf0Sagc       printf("# i = %d\n", i);
280*63d4abf0Sagc       tmpbuf[i] = ')';
281*63d4abf0Sagc       tmpbuf[i+1] = '*';
282*63d4abf0Sagc       tmpbuf[i+2] = '\0';
283*63d4abf0Sagc       printf("# pat = %s\n", tmpbuf);
284*63d4abf0Sagc       tre_regcomp(&reobj, tmpbuf, REG_EXTENDED);
285*63d4abf0Sagc 
286*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
287*63d4abf0Sagc       stats(sample_data, samples, len);
288*63d4abf0Sagc       len = len + (max_len/steps);
289*63d4abf0Sagc       tre_regfree(&reobj);
290*63d4abf0Sagc     }
291*63d4abf0Sagc     free(str);
292*63d4abf0Sagc     break;
293*63d4abf0Sagc 
294*63d4abf0Sagc   case 5:
295*63d4abf0Sagc     printf("# pattern: \"foobar\"\n");
296*63d4abf0Sagc     printf("# string:  \"aaaaaa...foobar\"\n");
297*63d4abf0Sagc     len = 0;
298*63d4abf0Sagc     tre_regcomp(&reobj, "foobar", REG_EXTENDED);
299*63d4abf0Sagc     while (len <= max_len) {
300*63d4abf0Sagc       str = malloc(sizeof(char) * (len+7));
301*63d4abf0Sagc       for (i = 0; i < len; i++) {
302*63d4abf0Sagc 	if (i*i % 3)
303*63d4abf0Sagc 	  str[i] = 'a';
304*63d4abf0Sagc 	else
305*63d4abf0Sagc 	  str[i] = 'a';
306*63d4abf0Sagc       }
307*63d4abf0Sagc       str[len+0] = 'f';
308*63d4abf0Sagc       str[len+1] = 'o';
309*63d4abf0Sagc       str[len+2] = 'o';
310*63d4abf0Sagc       str[len+3] = 'b';
311*63d4abf0Sagc       str[len+4] = 'a';
312*63d4abf0Sagc       str[len+5] = 'r';
313*63d4abf0Sagc       str[len+6] = '\0';
314*63d4abf0Sagc 
315*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
316*63d4abf0Sagc       stats(sample_data, samples, len);
317*63d4abf0Sagc       len = len + (max_len/steps);
318*63d4abf0Sagc       free(str);
319*63d4abf0Sagc     }
320*63d4abf0Sagc     break;
321*63d4abf0Sagc 
322*63d4abf0Sagc 
323*63d4abf0Sagc   case 6:
324*63d4abf0Sagc     printf("# pattern: \"a*foobar\"\n");
325*63d4abf0Sagc     printf("# string:  \"aaaaaa...foobar\"\n");
326*63d4abf0Sagc     len = 0;
327*63d4abf0Sagc     tre_regcomp(&reobj, "a*foobar", REG_EXTENDED);
328*63d4abf0Sagc     while (len <= max_len) {
329*63d4abf0Sagc       str = malloc(sizeof(char) * (len+7));
330*63d4abf0Sagc       for (i = 0; i < len; i++) {
331*63d4abf0Sagc 	str[i] = 'a';
332*63d4abf0Sagc       }
333*63d4abf0Sagc       str[len+0] = 'f';
334*63d4abf0Sagc       str[len+1] = 'o';
335*63d4abf0Sagc       str[len+2] = 'o';
336*63d4abf0Sagc       str[len+3] = 'b';
337*63d4abf0Sagc       str[len+4] = 'a';
338*63d4abf0Sagc       str[len+5] = 'r';
339*63d4abf0Sagc       str[len+6] = '\0';
340*63d4abf0Sagc 
341*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
342*63d4abf0Sagc       stats(sample_data, samples, len);
343*63d4abf0Sagc       len = len + (max_len/steps);
344*63d4abf0Sagc       free(str);
345*63d4abf0Sagc     }
346*63d4abf0Sagc     break;
347*63d4abf0Sagc 
348*63d4abf0Sagc 
349*63d4abf0Sagc   case 7:
350*63d4abf0Sagc     printf("# pattern: \"(a)*foobar\"\n");
351*63d4abf0Sagc     printf("# string:  \"aaaaabbaaab...foobar\"\n");
352*63d4abf0Sagc     len = 0;
353*63d4abf0Sagc     tre_regcomp(&reobj, "(a)*foobar", REG_EXTENDED);
354*63d4abf0Sagc     while (len <= max_len) {
355*63d4abf0Sagc       str = malloc(sizeof(char) * (len+7));
356*63d4abf0Sagc       for (i = 0; i < len; i++) {
357*63d4abf0Sagc 	/* Without this GNU regex won't find a match! */
358*63d4abf0Sagc 	if (i*(i-1) % 3)
359*63d4abf0Sagc 	  str[i] = 'b';
360*63d4abf0Sagc 	else
361*63d4abf0Sagc 	  str[i] = 'a';
362*63d4abf0Sagc       }
363*63d4abf0Sagc       str[len+0] = 'f';
364*63d4abf0Sagc       str[len+1] = 'o';
365*63d4abf0Sagc       str[len+2] = 'o';
366*63d4abf0Sagc       str[len+3] = 'b';
367*63d4abf0Sagc       str[len+4] = 'a';
368*63d4abf0Sagc       str[len+5] = 'r';
369*63d4abf0Sagc       str[len+6] = '\0';
370*63d4abf0Sagc 
371*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
372*63d4abf0Sagc       stats(sample_data, samples, len);
373*63d4abf0Sagc       len = len + (max_len/steps);
374*63d4abf0Sagc       free(str);
375*63d4abf0Sagc     }
376*63d4abf0Sagc     break;
377*63d4abf0Sagc 
378*63d4abf0Sagc 
379*63d4abf0Sagc   case 8:
380*63d4abf0Sagc     printf("# pattern: \"(a|b)*foobar\"\n");
381*63d4abf0Sagc     printf("# string:  \"aaaaabbaaab...foobar\"\n");
382*63d4abf0Sagc     len = 0;
383*63d4abf0Sagc     tre_regcomp(&reobj, "(a|b)*foobar", REG_EXTENDED);
384*63d4abf0Sagc     while (len <= max_len) {
385*63d4abf0Sagc       str = malloc(sizeof(char) * (len+7));
386*63d4abf0Sagc       for (i = 0; i < len; i++) {
387*63d4abf0Sagc 	if (i*(i-1) % 3)
388*63d4abf0Sagc 	  str[i] = 'b';
389*63d4abf0Sagc 	else
390*63d4abf0Sagc 	  str[i] = 'a';
391*63d4abf0Sagc 	/* Without this GNU regex won't find a match! */
392*63d4abf0Sagc 	if (i % (1024*1024*10 - 100))
393*63d4abf0Sagc 	  str[i] = 'f';
394*63d4abf0Sagc       }
395*63d4abf0Sagc       str[len+0] = 'f';
396*63d4abf0Sagc       str[len+1] = 'o';
397*63d4abf0Sagc       str[len+2] = 'o';
398*63d4abf0Sagc       str[len+3] = 'b';
399*63d4abf0Sagc       str[len+4] = 'a';
400*63d4abf0Sagc       str[len+5] = 'r';
401*63d4abf0Sagc       str[len+6] = '\0';
402*63d4abf0Sagc 
403*63d4abf0Sagc       run_tests(len, samples, sample_data, repeats, &reobj, str, tmpbuf);
404*63d4abf0Sagc       stats(sample_data, samples, len);
405*63d4abf0Sagc       len = len + (max_len/steps);
406*63d4abf0Sagc       free(str);
407*63d4abf0Sagc     }
408*63d4abf0Sagc     break;
409*63d4abf0Sagc 
410*63d4abf0Sagc 
411*63d4abf0Sagc   case 9:
412*63d4abf0Sagc     printf("# pattern: hand-coded a*\n");
413*63d4abf0Sagc     printf("# string:  \"aaaaaa...\"\n");
414*63d4abf0Sagc     len = 0;
415*63d4abf0Sagc     while (len <= max_len) {
416*63d4abf0Sagc       printf("# len = %d\n", len);
417*63d4abf0Sagc 
418*63d4abf0Sagc       str = malloc(sizeof(char)*(len+1));
419*63d4abf0Sagc       for (i = 0; i < len; i++)
420*63d4abf0Sagc 	str[i] = 'a';
421*63d4abf0Sagc       str[len-1] = '\0';
422*63d4abf0Sagc 
423*63d4abf0Sagc       for (i = 0; i < samples; i++) {
424*63d4abf0Sagc 	c1 = clock();
425*63d4abf0Sagc 	for (j = 0; j < repeats; j++) {
426*63d4abf0Sagc 	  char *s;
427*63d4abf0Sagc 	  int l;
428*63d4abf0Sagc 
429*63d4abf0Sagc 	  s = str;
430*63d4abf0Sagc 	  l = 0;
431*63d4abf0Sagc 
432*63d4abf0Sagc 
433*63d4abf0Sagc 	  while (s != '\0') {
434*63d4abf0Sagc 	    if (*s == 'a') {
435*63d4abf0Sagc 	      s++;
436*63d4abf0Sagc 	      l++;
437*63d4abf0Sagc 	    } else
438*63d4abf0Sagc 	      break;
439*63d4abf0Sagc 	  }
440*63d4abf0Sagc 	}
441*63d4abf0Sagc       	c2 = clock();
442*63d4abf0Sagc 	sample_data[i] = (double)(c2-c1)/(CLOCKS_PER_SEC*repeats);
443*63d4abf0Sagc 
444*63d4abf0Sagc 	printf("# sample: %.5f sec, clocks: %ld\n",
445*63d4abf0Sagc 	       (double)(c2-c1)/(CLOCKS_PER_SEC*repeats),
446*63d4abf0Sagc 	       (long)(c2-c1));
447*63d4abf0Sagc 	fflush(stdout);
448*63d4abf0Sagc       }
449*63d4abf0Sagc       fflush(stdout);
450*63d4abf0Sagc 
451*63d4abf0Sagc       stats(sample_data, samples, len);
452*63d4abf0Sagc       len = len + (max_len/steps);
453*63d4abf0Sagc       free(str);
454*63d4abf0Sagc     }
455*63d4abf0Sagc     break;
456*63d4abf0Sagc 
457*63d4abf0Sagc 
458*63d4abf0Sagc   default:
459*63d4abf0Sagc     printf("Pelle.\n");
460*63d4abf0Sagc     return 1;
461*63d4abf0Sagc   }
462*63d4abf0Sagc 
463*63d4abf0Sagc   tre_regfree(&reobj);
464*63d4abf0Sagc 
465*63d4abf0Sagc   return 0;
466*63d4abf0Sagc }
467