| /* |
| * fake - make up random lines resembling history-file entries, reproducibly |
| * |
| * -Log- |
| */ |
| |
| #include <stdio.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <string.h> |
| |
| #define MAXSTR 500 /* For sizing strings -- DON'T use BUFSIZ! */ |
| #define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) |
| |
| #ifndef lint |
| static char RCSid[] = "$Header: /rel/cvsfiles/devo/libio/dbz/fake.c,v 1.2 1993/10/25 20:02:42 bothner Exp $"; |
| #endif |
| |
| int midonly = 0; /* just message ids, rest not realistic */ |
| int tag = 0; /* tag lines with random digit for later use */ |
| int expired = -1; /* percentage of lines to be expired */ |
| |
| int debug = 0; |
| char *progname; |
| |
| char *inname; /* filename for messages etc. */ |
| long lineno; /* line number for messages etc. */ |
| |
| void doline(); |
| void addchars(); |
| void seed(); |
| |
| /* |
| - main - parse arguments and handle options |
| */ |
| int |
| main(argc, argv) |
| int argc; |
| char *argv[]; |
| { |
| int c; |
| int errflg = 0; |
| FILE *in; |
| struct stat statbuf; |
| extern int optind; |
| extern char *optarg; |
| void process(); |
| register long no; |
| extern long atol(); |
| char line[MAXSTR]; |
| |
| progname = argv[0]; |
| |
| while ((c = getopt(argc, argv, "ms:te:d")) != EOF) |
| switch (c) { |
| case 'm': /* message-ids only */ |
| midonly = 1; |
| break; |
| case 's': /* seed */ |
| seed(atol(optarg)); |
| break; |
| case 't': /* tag lines with a random digit */ |
| tag = 1; |
| break; |
| case 'e': /* percentage to be expired */ |
| expired = atoi(optarg); |
| break; |
| case 'd': /* Debugging. */ |
| debug++; |
| break; |
| case '?': |
| default: |
| errflg++; |
| break; |
| } |
| if (errflg || optind != argc - 1) { |
| fprintf(stderr, "usage: %s ", progname); |
| fprintf(stderr, "[-m] [-s seed] length\n"); |
| exit(2); |
| } |
| |
| for (no = atol(argv[optind]); no > 0; no--) { |
| doline(line); |
| puts(line); |
| } |
| #ifdef DBZ_FINISH |
| DBZ_FINISH; |
| #endif |
| exit(0); |
| } |
| |
| /* |
| - doline - generate random history pseudo-line |
| */ |
| void |
| doline(buf) |
| char *buf; |
| { |
| char tagch[2]; |
| |
| (void) strcpy(buf, "<"); |
| addchars(buf, range(4, 20)); |
| (void) strcat(buf, "@"); |
| addchars(buf, range(8, 20)); |
| if (midonly) |
| (void) strcat(buf, ">\tx"); |
| else { |
| if (tag) { |
| tagch[0] = "1234567890"[range(0,9)]; |
| tagch[1] = '\0'; |
| (void) strcat(buf, ">\t"); |
| (void) strcat(buf, tagch); |
| (void) strcat(buf, "00000000~-"); |
| } else |
| (void) strcat(buf, ">\t1234567890~-"); |
| } |
| if (range(1, 100) > expired) { |
| if (midonly) |
| (void) strcat(buf, "\tx"); |
| else { |
| (void) strcat(buf, "\t"); |
| addchars(buf, range(10, 30)); |
| } |
| } |
| } |
| |
| /* |
| - addchars - generate n random characters suitable for history file |
| */ |
| void |
| addchars(buf, len) |
| char *buf; |
| int len; |
| { |
| register int i; |
| register char *p = buf + strlen(buf); |
| static char vocab[] = "1234567890.abcde.fghij.klmno.pqrst.uvwxyz.\ |
| 1234567890.ABCDE.FGHIJ.KLMNO.PQRST.UVWXYZ.1234567890.\ |
| 1234567890.abcde.fghij.klmno.pqrst.uvwxyz.1234567890"; |
| |
| for (i = len; i > 0; i--) |
| *p++ = vocab[range(0, sizeof(vocab)-2)]; |
| *p++ = '\0'; |
| } |