/* * genfile — generate a text file of N lines, each a random 10-character * alphanumeric string followed by a newline. Used by the fastwc benchmarks * (createtxt in std.sh) to build test data quickly; std.sh falls back to a * slow shell loop when this binary has not been built. * * usage: genfile */ #include #include #include #include #include #define LINE_LEN 10 #define CHUNK (64 * 1024) static const char alpha[] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789"; #define ALPHA_LEN (sizeof(alpha) - 1) static uint64_t state; static uint64_t next(void) { state ^= state << 13; state ^= state >> 7; state ^= state << 17; return state; } int main(int argc, char **argv) { long n; long i; int j; char buf[CHUNK]; size_t used = 0; if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); return 2; } n = atol(argv[1]); if (n < 0) { fprintf(stderr, "genfile: invalid line count: %s\n", argv[1]); return 2; } /* seed from time + pid so each run produces fresh data */ state = (uint64_t)time(NULL) ^ ((uint64_t)getpid() << 32) ^ 0x9E3779B97F4A7C15ULL; for (i = 0; i < n; i++) { for (j = 0; j < LINE_LEN; j++) buf[used++] = alpha[next() % ALPHA_LEN]; buf[used++] = '\n'; if (used + LINE_LEN + 1 > CHUNK) { if (fwrite(buf, 1, used, stdout) != used) return 1; used = 0; } } if (used && fwrite(buf, 1, used, stdout) != used) return 1; if (fclose(stdout) != 0) return 1; return 0; }