Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/sort/gen.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1996-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* Phong Vo <[email protected]> *
19
* Doug McIlroy <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
/*
25
* Glenn Fowler
26
* AT&T Research
27
*
28
* generate test data
29
*/
30
31
static const char id[] = "\n@(#)$Id: gen (AT&T Research) 1998-05-11 $\0\n";
32
33
#include <ast.h>
34
#include <error.h>
35
36
static unsigned char hit[UCHAR_MAX+1];
37
static unsigned char data[UCHAR_MAX+1];
38
39
#define ALPHA 62
40
#define BINARY (UCHAR_MAX+1)
41
#define NUMERIC 10
42
43
#define RAND() (state.seed=(state.seed*0x63c63cd9L+1)&0xffffffff)
44
#define ROUND(n,s) ((n)=(((n)+(s)-1)/(s))*(s))
45
46
typedef struct
47
{
48
unsigned long min;
49
unsigned long max;
50
} Range_t;
51
52
static struct
53
{
54
unsigned char* buf;
55
int charset;
56
int part;
57
Range_t range[UCHAR_MAX+1];
58
unsigned long seed;
59
} state;
60
61
static int
62
gen(register int m)
63
{
64
int c;
65
66
if (state.part >= state.range['d'].min)
67
{
68
state.part = 0;
69
RAND();
70
}
71
c = data[(state.seed >> state.part) % m];
72
state.part += CHAR_BIT;
73
return c;
74
}
75
76
main(int argc, char** argv)
77
{
78
register unsigned int c;
79
register unsigned int i;
80
register unsigned int k;
81
register unsigned long n;
82
int newline = 0;
83
char* e;
84
85
error_info.id = "gen";
86
state.range['d'].min = sizeof(state.seed) * CHAR_BIT;
87
state.range['r'].min = 0x00001000;
88
state.range['s'].min = 0x00100000;
89
state.seed = 0x12345678;
90
state.charset = ALPHA;
91
i = 0;
92
e = "0123456789";
93
while (c = *e++)
94
{
95
hit[c] = 1;
96
data[i++] = c;
97
}
98
e = "abcdefghijklmnopqrstuvwxyz";
99
while (c = *e++)
100
{
101
hit[c] = 1;
102
data[i++] = c;
103
}
104
e = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
105
while (c = *e++)
106
{
107
hit[c] = 1;
108
data[i++] = c;
109
}
110
#if 0
111
e = "`-=[]\\{}|;':\",./<>?~!@#$%^&*()_+";
112
while (c = *e++)
113
{
114
hit[c] = 1;
115
data[i++] = c;
116
}
117
#endif
118
for (c = 0; c <= elementsof(data); c++)
119
if (!hit[c])
120
data[i++] = c;
121
while (c = optget(argv, "bd:[dup[:max]]f:[float-key[:max]]i:[int-key[:max]]k:[key]l:[lcm]p:[prefix[:max]]r:[record:[max]]s:[size]"))
122
switch (c)
123
{
124
case 'b':
125
state.charset = BINARY;
126
break;
127
case 'd':
128
case 'f':
129
case 'i':
130
case 'k':
131
case 'l':
132
case 'n':
133
case 'p':
134
case 'r':
135
case 's':
136
state.range[c].min = strton(opt_info.arg, &e, NiL, 0);
137
if (*e)
138
state.range[c].max = strton(e + 1, NiL, NiL, 0);
139
break;
140
case '?':
141
error(ERROR_USAGE|4, opt_info.arg);
142
break;
143
case ':':
144
error(2, opt_info.arg);
145
break;
146
}
147
if (state.range['l'].min)
148
ROUND(state.range['s'].min, state.range['l'].min);
149
if (state.range['r'].max)
150
{
151
newline = 1;
152
state.range['r'].min--;
153
if (state.range['r'].max < state.range['r'].min)
154
state.range['r'].max = state.range['r'].min;
155
if (state.range['r'].max <= (state.range['r'].min + 1))
156
state.range['r'].max = 1;
157
else
158
state.range['r'].max -= state.range['r'].min + 1;
159
}
160
else
161
state.range['r'].max = 1;
162
if (state.range['p'].min)
163
{
164
if (state.range['p'].min > state.range['r'].min)
165
state.range['p'].min = state.range['r'].min;
166
if (state.range['p'].max < state.range['p'].min)
167
state.range['p'].max = state.range['p'].min;
168
if (state.range['p'].max > state.range['r'].min + state.range['r'].max)
169
state.range['p'].max = state.range['r'].min + state.range['r'].max;
170
if (state.range['p'].max <= (state.range['p'].min + 1))
171
state.range['p'].max = 1;
172
else
173
state.range['p'].max -= state.range['p'].min + 1;
174
}
175
if (state.range['f'].min)
176
{
177
if (state.range['f'].min >= state.range['r'].min)
178
state.range['f'].min = state.range['r'].min - 1;
179
if (state.range['f'].max < state.range['f'].min)
180
state.range['f'].max = state.range['f'].min;
181
if (state.range['f'].max > state.range['r'].min + state.range['r'].max)
182
state.range['f'].max = state.range['r'].min + state.range['r'].max;
183
if (state.range['f'].max <= (state.range['f'].min + 1))
184
state.range['f'].max = 1;
185
else
186
state.range['f'].max -= state.range['f'].min + 1;
187
}
188
if (state.range['i'].min)
189
{
190
if (state.range['i'].min >= state.range['r'].min)
191
state.range['i'].min = state.range['r'].min - 1;
192
if (state.range['i'].max < state.range['i'].min)
193
state.range['i'].max = state.range['i'].min;
194
if (state.range['i'].max > state.range['r'].min + state.range['r'].max)
195
state.range['i'].max = state.range['r'].min + state.range['r'].max;
196
if (state.range['i'].max <= (state.range['i'].min + 1))
197
state.range['i'].max = 1;
198
else
199
state.range['i'].max -= state.range['i'].min + 1;
200
}
201
if (!(state.buf = newof(0, unsigned char,
202
state.range['f'].min + state.range['f'].max + 1 +
203
state.range['i'].min + state.range['i'].max + 1 +
204
state.range['k'].min + state.range['k'].max +
205
state.range['p'].min + state.range['p'].max +
206
2 * (state.range['r'].min + state.range['r'].max),
207
1)))
208
error(ERROR_SYSTEM|3, "out of space [buf]");
209
n = state.range['s'].min;
210
do
211
{
212
i = 0;
213
if (state.range['f'].min)
214
{
215
k = state.range['f'].min + (RAND() % state.range['f'].max) - 6;
216
state.buf[i++] = '.';
217
while (i < k)
218
state.buf[i++] = gen(NUMERIC);
219
state.buf[i++] = 'e';
220
state.buf[i++] = "-+"[RAND() % 2];
221
state.buf[i++] = gen(NUMERIC);
222
state.buf[i++] = gen(NUMERIC);
223
state.buf[i++] = ':';
224
}
225
if (state.range['i'].min)
226
{
227
k = state.range['i'].min + (RAND() % state.range['i'].max);
228
while (i < k)
229
state.buf[i++] = gen(NUMERIC);
230
state.buf[i++] = ':';
231
}
232
if (state.range['p'].min)
233
{
234
k = state.range['p'].min + (RAND() % state.range['p'].max);
235
c = gen(state.charset);
236
while (i < k)
237
state.buf[i++] = c;
238
}
239
k = state.range['k'].min ? state.range['k'].min : state.range['r'].min + (RAND() % state.range['r'].max);
240
while (i < k)
241
state.buf[i++] = gen(state.charset);
242
if (state.range['k'].min)
243
{
244
k = state.range['r'].min + (RAND() % state.range['r'].max);
245
while (i < k)
246
state.buf[i++] = ' ';
247
}
248
if (newline)
249
state.buf[i++] = '\n';
250
if (i > n)
251
{
252
i = n;
253
if (newline)
254
state.buf[n - 1] = '\n';
255
}
256
sfwrite(sfstdout, state.buf, i);
257
} while (n -= i);
258
exit(0);
259
}
260
261