1/* 2 * fake - make up random lines resembling history-file entries, reproducibly 3 * 4 * -Log- 5 */ 6 7#include <stdio.h> 8#include <sys/types.h> 9#include <sys/stat.h> 10#include <string.h> 11 12#define MAXSTR 500 /* For sizing strings -- DON'T use BUFSIZ! */ 13#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) 14 15#ifndef lint 16static char RCSid[] = "$Header: /tmp/bonefish/open-beos/buildtools/gcc/libio/dbz/fake.c,v 1.1 2004/10/28 18:14:04 zooey Exp $"; 17#endif 18 19int midonly = 0; /* just message ids, rest not realistic */ 20int tag = 0; /* tag lines with random digit for later use */ 21int expired = -1; /* percentage of lines to be expired */ 22 23int debug = 0; 24char *progname; 25 26char *inname; /* filename for messages etc. */ 27long lineno; /* line number for messages etc. */ 28 29void doline(); 30void addchars(); 31void seed(); 32 33/* 34 - main - parse arguments and handle options 35 */ 36int 37main(argc, argv) 38int argc; 39char *argv[]; 40{ 41 int c; 42 int errflg = 0; 43 FILE *in; 44 struct stat statbuf; 45 extern int optind; 46 extern char *optarg; 47 void process(); 48 register long no; 49 extern long atol(); 50 char line[MAXSTR]; 51 52 progname = argv[0]; 53 54 while ((c = getopt(argc, argv, "ms:te:d")) != EOF) 55 switch (c) { 56 case 'm': /* message-ids only */ 57 midonly = 1; 58 break; 59 case 's': /* seed */ 60 seed(atol(optarg)); 61 break; 62 case 't': /* tag lines with a random digit */ 63 tag = 1; 64 break; 65 case 'e': /* percentage to be expired */ 66 expired = atoi(optarg); 67 break; 68 case 'd': /* Debugging. */ 69 debug++; 70 break; 71 case '?': 72 default: 73 errflg++; 74 break; 75 } 76 if (errflg || optind != argc - 1) { 77 fprintf(stderr, "usage: %s ", progname); 78 fprintf(stderr, "[-m] [-s seed] length\n"); 79 exit(2); 80 } 81 82 for (no = atol(argv[optind]); no > 0; no--) { 83 doline(line); 84 puts(line); 85 } 86#ifdef DBZ_FINISH 87 DBZ_FINISH; 88#endif 89 exit(0); 90} 91 92/* 93 - doline - generate random history pseudo-line 94 */ 95void 96doline(buf) 97char *buf; 98{ 99 char tagch[2]; 100 101 (void) strcpy(buf, "<"); 102 addchars(buf, range(4, 20)); 103 (void) strcat(buf, "@"); 104 addchars(buf, range(8, 20)); 105 if (midonly) 106 (void) strcat(buf, ">\tx"); 107 else { 108 if (tag) { 109 tagch[0] = "1234567890"[range(0,9)]; 110 tagch[1] = '\0'; 111 (void) strcat(buf, ">\t"); 112 (void) strcat(buf, tagch); 113 (void) strcat(buf, "00000000~-"); 114 } else 115 (void) strcat(buf, ">\t1234567890~-"); 116 } 117 if (range(1, 100) > expired) { 118 if (midonly) 119 (void) strcat(buf, "\tx"); 120 else { 121 (void) strcat(buf, "\t"); 122 addchars(buf, range(10, 30)); 123 } 124 } 125} 126 127/* 128 - addchars - generate n random characters suitable for history file 129 */ 130void 131addchars(buf, len) 132char *buf; 133int len; 134{ 135 register int i; 136 register char *p = buf + strlen(buf); 137 static char vocab[] = "1234567890.abcde.fghij.klmno.pqrst.uvwxyz.\ 1381234567890.ABCDE.FGHIJ.KLMNO.PQRST.UVWXYZ.1234567890.\ 1391234567890.abcde.fghij.klmno.pqrst.uvwxyz.1234567890"; 140 141 for (i = len; i > 0; i--) 142 *p++ = vocab[range(0, sizeof(vocab)-2)]; 143 *p++ = '\0'; 144} 145