diff options
Diffstat (limited to 'ACE/apps/JAWS3/bench/mkfiles.cpp')
-rw-r--r-- | ACE/apps/JAWS3/bench/mkfiles.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/ACE/apps/JAWS3/bench/mkfiles.cpp b/ACE/apps/JAWS3/bench/mkfiles.cpp new file mode 100644 index 00000000000..42bc2c969fa --- /dev/null +++ b/ACE/apps/JAWS3/bench/mkfiles.cpp @@ -0,0 +1,156 @@ +// $Id$ + +#include "ace/OS.h" +#include "ace/Get_Opt.h" +//FUZZ: disable check_for_math_include/ +#include <math.h> + +static float gammln (float xx); +static float poidev (float xm); + +int main (int argc, char *argv[]) +{ + ACE_Get_Opt options (argc, argv, "m:s:x:n:"); + // m -- median file size in kB + // x -- maximum file size in kB + // n -- number of files + + long median = 8; + long maximum = 1024; + long number = 1000; + + int c; + while ((c = options ()) != -1) + { + switch (c) + { + case 'm': + median = ACE_OS::atoi (options.optarg); + break; + case 'x': + maximum = ACE_OS::atoi (options.optarg); + break; + case 'n': + number = ACE_OS::atoi (options.optarg); + break; + default: + break; + } + } + + char filename[1024]; + const char *seventyfive_bytes = "\ +01010101010101010101010101010101010101010101010101010101010101010101010101\n\ +"; + + int seen_max = 0; + + long i; + for (i = 0; i < number; i++) + { + long size = 0; + float p = ::floor (::pow (2, poidev (::log (2 * median)/::log (2)) - 1)); + if (p > maximum) + p = maximum; + p *= 1024; + if (p < 1.0) + p = 1.0; + size = (long) p; + if (i == (number - 1)) + if (! seen_max) + size = maximum * 1024; + else + seen_max = (size == (maximum * 1024)); + + ::sprintf (filename, "file%011ld.html", i); + FILE *fp = ::fopen (filename, "w+b"); + while (size > 75) + { + fprintf (fp, "%s", seventyfive_bytes); + size -= 75; + } + if (size > 15) + { + fprintf (fp, "%0*.0f\n", (int) (size - 1), p); + } + else + { + fprintf (fp, "%015.0f\n", p + 16 - size); + } + fclose (fp); + } + + return 0; +} + +static float +gammln (float xx) +{ + double x, y, tmp, ser; + static const double cof[6] = { 76.18009172947146, + -86.50532032941677, + 24.01409824083091, + -1.231739572450155, + 0.1208650973866179e-2, + -0.5395239384953e-5 }; + int j; + + y = x = xx; + tmp = x + 5.5; + tmp -= (x+0.5) * ::log (tmp); + + ser = 1.000000000190015; + for (j = 0; j < 6; j++) + ser += cof[j]/++y; + + return -tmp + ::log (2.5066282746310005 * ser / x); +} + +static float +poidev (float xm) +{ + static const double PI = 3.141592654; + static float sq, alxm, g, oldm = -1.0; + float em, t, y, fem; + + if (xm < 2.0) + { + if (xm != oldm) + { + oldm = xm; + g = ::exp (-xm); + } + em = -1.0; + t = 1.0; + do + { + ++em; + t *= (1.0 + ::rand ())/RAND_MAX; + } + while (t > g); + } + else + { + if (xm != oldm) + { + oldm = xm; + sq = ::sqrt (2.0 + xm); + alxm = log (xm); + g = xm * alxm - gammln (xm + 1.0); + } + do + { + do + { + y = ::tan (PI * (1.0 + ::rand ())/RAND_MAX); + em = sq * y + xm; + } + while (em < 0.0); + fem = ::floor (em); + t = 0.9 * (1.0 + y * y) * ::exp (fem * alxm - gammln (fem + 1.0) - g); + } + while ((1.0 + ::rand ())/RAND_MAX > t); + } + + return em; +} |