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