summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS3/bench/mkfiles.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS3/bench/mkfiles.cpp')
-rw-r--r--ACE/apps/JAWS3/bench/mkfiles.cpp156
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;
+}