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