Go to the documentation of this file.00001
00033
00034
00035
00036
00037 #include <stdlib.h>
00038 #include <stdio.h>
00039 #include <string.h>
00040
00042 #define rnd() (seed = 1664525 * seed + 1013904223, (seed >> 24) & 0xff)
00043
00045 int main(int argc, char **argv)
00046 {
00047 int i;
00048 int size = 1024;
00049 int maxLineLength = 60;
00050 enum { Random, CR, LF, CRLF } eol = Random;
00051 int ascii = 0;
00052 int count;
00053 int countForLine;
00054 unsigned long seed = 1;
00055 unsigned char c;
00056
00057 for (i = 1; i < argc; i++)
00058 if (!strcmp(argv[i], "--size") && i + 1 < argc)
00059 size = strtol(argv[++i], NULL, 0);
00060 else if (!strcmp(argv[i], "--maxlinelength") && i + 1 < argc)
00061 maxLineLength = strtol(argv[++i], NULL, 0);
00062 else if (!strcmp(argv[i], "--ascii"))
00063 ascii = 1;
00064 else if (!strcmp(argv[i], "--cr"))
00065 eol = CR;
00066 else if (!strcmp(argv[i], "--lf"))
00067 eol = LF;
00068 else if (!strcmp(argv[i], "--crlf"))
00069 eol = CRLF;
00070 else if (!strcmp(argv[i], "--seed") && i + 1 < argc)
00071 seed = strtol(argv[++i], NULL, 0);
00072 else
00073 {
00074 if (strcmp(argv[i], "--help"))
00075 fprintf(stderr, "Unknown option %s\n", argv[i]);
00076 fprintf(stderr, "Usage: %s [options]\n"
00077 "Generate random input for testing Nyctergatis Markup Engine.\n"
00078 "--ascii ASCII output (default: random bytes)\n"
00079 "--cr CR (0x0D) for end-of-line (default: random)\n"
00080 "--crlf CRLF (0x0D 0x0A) for end-of-line (default: random)\n"
00081 "--help display this help message and exit\n"
00082 "--lf LF (0x0A) for end-of-line (default: random)\n"
00083 "--maxlinelength max number of characters per line, or 0 for no limit\n"
00084 "--seed seed of the pseudorandom generator (default: 1)\n"
00085 "--size approximate size of output in bytes\n",
00086 argv[0]);
00087 exit(0);
00088 }
00089
00090
00091 rnd();
00092
00093 for (count = countForLine = 0; count < size; )
00094 {
00095 c = rnd();
00096
00097
00098 if (maxLineLength > 0 && countForLine >= maxLineLength
00099 || c < 5 || countForLine == 0 && c < 51)
00100 {
00101 switch (eol)
00102 {
00103 case CR:
00104 printf("\x0d");
00105 count++;
00106 break;
00107 case LF:
00108 printf("\x0a");
00109 count++;
00110 break;
00111 case CRLF:
00112 printf("\x0d\x0a");
00113 count += 2;
00114 break;
00115 case Random:
00116 default:
00117 c = rnd();
00118 switch (c & 0xc0)
00119 {
00120 case 0:
00121 printf("\x0d");
00122 count++;
00123 break;
00124 case 0x80:
00125 printf("\x0a");
00126 count++;
00127 break;
00128 default:
00129 printf("\x0d\x0a");
00130 count += 2;
00131 break;
00132 }
00133 break;
00134 }
00135 countForLine = 0;
00136 continue;
00137 }
00138
00139
00140 c = rnd();
00141 if (countForLine == 0 && c < 51)
00142 {
00143 while (count < size)
00144 {
00145 c = rnd();
00146 switch ((c >> 5) & 7)
00147 {
00148 case 0:
00149 printf("*");
00150 break;
00151 case 1:
00152 printf("#");
00153 break;
00154 case 2:
00155 printf(":");
00156 break;
00157 case 3:
00158 printf(";");
00159 break;
00160 case 4:
00161 printf("|");
00162 break;
00163 default:
00164 printf("*");
00165 break;
00166 }
00167 count++;
00168 countForLine++;
00169 if (rnd() > 128)
00170 break;
00171 }
00172 continue;
00173 }
00174
00175
00176 c = rnd();
00177 switch (c >> 2)
00178 {
00179 case 0:
00180 printf("**");
00181 count += 2;
00182 countForLine += 2;
00183 continue;
00184 case 1:
00185 printf("//");
00186 count += 2;
00187 countForLine += 2;
00188 continue;
00189 case 2:
00190 printf("__");
00191 count += 2;
00192 countForLine += 2;
00193 continue;
00194 case 3:
00195 printf("##");
00196 count += 2;
00197 countForLine += 2;
00198 continue;
00199 case 4:
00200 printf(",,");
00201 count += 2;
00202 countForLine += 2;
00203 continue;
00204 case 5:
00205 printf("^^");
00206 count += 2;
00207 countForLine += 2;
00208 continue;
00209 case 6:
00210 printf("{{");
00211 count += 2;
00212 countForLine += 2;
00213 continue;
00214 case 7:
00215 printf("}}");
00216 count += 2;
00217 countForLine += 2;
00218 continue;
00219 case 8:
00220 printf("[[");
00221 count += 2;
00222 countForLine += 2;
00223 continue;
00224 case 9:
00225 printf("]]");
00226 count += 2;
00227 countForLine += 2;
00228 continue;
00229 case 10:
00230 printf("http://");
00231 count += 7;
00232 countForLine += 7;
00233 continue;
00234 }
00235
00236
00237 for (;;)
00238 {
00239 c = rnd();
00240 if (!ascii || c >= 32 && c < 127)
00241 {
00242 printf("%c", c);
00243 count++;
00244 countForLine++;
00245 break;
00246 }
00247 }
00248 }
00249
00250 return 0;
00251 }