nyctergatis.com

Contact

Projects
Sysquake Remote Live
NME
PDF
Hike
Sudoku
GifBuilder
jpeglib for Palm OS
MySQL Client
Cross-GCC for Mac OS
NMERandomGen.c
Go to the documentation of this file.
00001 
00033 /* License: new BSD license (see NME.h) */
00034 
00035 /* To compile: gcc -o nmerandom NMERandomGen.c */
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;  // number of characters generated
00053     int countForLine;   // number of characters generated
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     // skip first pseudorandom number to avoid zeros
00091     rnd();
00092     
00093     for (count = countForLine = 0; count < size; )
00094     {
00095         c = rnd();
00096         
00097         // eol: p = 2 %, or 20 % after an eol
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         // random number of special characters at beg. of line: p = 20 %
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)    // p = 50 % to break
00170                     break;
00171             }
00172             continue;
00173         }
00174         
00175         // random style: p = 20 %
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         // random character
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 }
Generated by Doxygen.
Copyright 2007-2013, Yves Piguet.
All rights reserved.