1 | /* |
2 | * $Id: varsub.c,v 1.9 2008/03/20 16:38:34 jms Exp $ |
3 | * |
4 | * Revision History |
5 | * =================== |
6 | * $Log: varsub.c,v $ |
7 | * Revision 1.9 2008/03/20 16:38:34 jms |
8 | * q14/q15: range correction |
9 | * |
10 | * Revision 1.8 2008/03/20 16:36:47 jms |
11 | * q14/15 format change |
12 | * |
13 | * Revision 1.7 2006/05/31 22:25:21 jms |
14 | * Rework UnifInt calls in varsub to handle lack of PROTO defn in windows |
15 | * |
16 | * Revision 1.6 2006/05/25 22:30:44 jms |
17 | * qgen porting for 32b/64b |
18 | * |
19 | * Revision 1.5 2006/05/25 16:08:52 jms |
20 | * Rework UnifInt call for query 3 |
21 | * |
22 | * Revision 1.4 2006/04/26 23:20:05 jms |
23 | * Data type clenaup for qgen |
24 | * |
25 | * Revision 1.3 2005/11/03 14:50:44 jms |
26 | * solaris porting changes |
27 | * |
28 | * Revision 1.2 2005/01/03 20:08:59 jms |
29 | * change line terminations |
30 | * |
31 | * Revision 1.1.1.1 2004/11/24 23:31:47 jms |
32 | * re-establish external server |
33 | * |
34 | * Revision 1.1.1.1 2003/04/03 18:54:21 jms |
35 | * recreation after CVS crash |
36 | * |
37 | * Revision 1.1.1.1 2003/04/03 18:54:21 jms |
38 | * initial checkin |
39 | * |
40 | * |
41 | */ |
42 | #include "config.h" |
43 | #include <stdio.h> |
44 | #ifndef _POSIX_SOURCE |
45 | #include <malloc.h> |
46 | #endif /* POSIX_SOURCE */ |
47 | #if (defined(_POSIX_)||!defined(WIN32)) |
48 | #include <unistd.h> |
49 | #endif /* WIN32 */ |
50 | #include <string.h> |
51 | #include "config.h" |
52 | #include "dss.h" |
53 | #include "tpcd.h" |
54 | #ifdef ADHOC |
55 | #include "adhoc.h" |
56 | extern adhoc_t adhocs[]; |
57 | #endif /* ADHOC */ |
58 | void permute(long *a, int c, long s); |
59 | #define MAX_PARAM 10 /* maximum number of parameter substitutions in a query */ |
60 | |
61 | extern long Seed[]; |
62 | extern char **asc_date; |
63 | extern double flt_scale; |
64 | extern distribution q13a, q13b; |
65 | |
66 | long brands[25] = {11,12,13,14,15,21,22,23,24,25,31,32,33,34,35, |
67 | 41,42,43,44,45,51,52,53,54,55}; |
68 | long sizes[50] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, |
69 | 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, |
70 | 41,42,43,44,45,46,47,48,49,50}; |
71 | long ccode[25] = {10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34}; |
72 | char *defaults[24][11] = |
73 | { |
74 | {"90" , NULL, NULL, |
75 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 1 */ |
76 | {"15" , "BRASS" , "EUROPE" , |
77 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 2 */ |
78 | {"BUILDING" , "1995-03-15" , NULL, |
79 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 3 */ |
80 | {"1993-07-01" , NULL, NULL, |
81 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 4 */ |
82 | {"ASIA" , "1994-01-01" , NULL, |
83 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 5 */ |
84 | {"1994-01-01" , ".06" , "24" , |
85 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 6 */ |
86 | {"FRANCE" , "GERMANY" , NULL, |
87 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 7 */ |
88 | {"BRAZIL" , "AMERICA" , "ECONOMY ANODIZED STEEL" , |
89 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},/* 8 */ |
90 | {"green" , NULL, NULL, |
91 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 9 */ |
92 | {"1993-10-01" , NULL, NULL, |
93 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 10 */ |
94 | {"GERMANY" , "0.0001" , NULL, |
95 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 11 */ |
96 | {"MAIL" , "SHIP" , "1994-01-01" , |
97 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 12 */ |
98 | {"special" , "requests" , NULL, |
99 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 13 */ |
100 | {"1995-09-01" , NULL, NULL, |
101 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 14 */ |
102 | {"1996-01-01" , NULL, NULL, |
103 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 15 */ |
104 | {"Brand#45" , "MEDIUM POLISHED" , "49" , |
105 | "14" ,"23" ,"45" ,"19" ,"3" ,"36" ,"9" , NULL}, /* 16 */ |
106 | {"Brand#23" , "MED BOX" , NULL, |
107 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 17 */ |
108 | {"300" , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 18 */ |
109 | {"Brand#12" , "Brand#23" , "Brand#34" , "1" , "10" , "20" , NULL, NULL, NULL, NULL, NULL}, /* 19 */ |
110 | {"forest" , "1994-01-01" , "CANADA" , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 20 */ |
111 | {"SAUDI ARABIA" , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* 21 */ |
112 | {"13" ,"31" ,"23" , "29" , "30" , "18" , "17" , NULL, NULL, NULL, NULL}, /* 22 */ |
113 | {NULL,NULL,NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* UF1 */ |
114 | {NULL,NULL,NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /* UF2 */ |
115 | }; |
116 | void |
117 | varsub(int qnum, int vnum, int flags) |
118 | { |
119 | static char param[11][128]; |
120 | static char formats[23][128]; |
121 | static FILE *lfp = NULL; |
122 | static int bInit = 0; |
123 | long *lptr; |
124 | char *ptr; |
125 | int i = 0; |
126 | DSS_HUGE tmp_date, tmp1, tmp2; |
127 | |
128 | if (!bInit) |
129 | { |
130 | sprintf(formats[4], "19%s-%s-01" , HUGE_DATE_FORMAT, HUGE_DATE_FORMAT); |
131 | sprintf(formats[5], "19%s-01-01" , HUGE_DATE_FORMAT); |
132 | sprintf(formats[6], "19%s-01-01" , HUGE_DATE_FORMAT); |
133 | sprintf(formats[7], "0.%s" , HUGE_DATE_FORMAT); /* used by q6 */ |
134 | sprintf(formats[10], "19%s-%s-01" , HUGE_DATE_FORMAT, HUGE_DATE_FORMAT); |
135 | sprintf(formats[12], "19%s-01-01" , HUGE_DATE_FORMAT); |
136 | sprintf(formats[14], "19%s-%s-01" , HUGE_DATE_FORMAT, HUGE_DATE_FORMAT); |
137 | sprintf(formats[15], "19%s-%s-01" , HUGE_DATE_FORMAT, HUGE_DATE_FORMAT); |
138 | sprintf(formats[16], "Brand#%s%s" , HUGE_FORMAT, HUGE_FORMAT); |
139 | sprintf(formats[17], "Brand#%s%s" , HUGE_FORMAT, HUGE_FORMAT); |
140 | sprintf(formats[19], "Brand#%s%s" , HUGE_FORMAT, HUGE_FORMAT); |
141 | sprintf(formats[20], "19%s-01-01" , HUGE_DATE_FORMAT); |
142 | bInit = 1; |
143 | } |
144 | |
145 | if (vnum == 0) |
146 | { |
147 | if ((flags & DFLT) == 0) |
148 | { |
149 | switch(qnum) |
150 | { |
151 | case 1: |
152 | sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)60,(DSS_HUGE)120,qnum)); |
153 | param[2][0] = '\0'; |
154 | break; |
155 | case 2: |
156 | sprintf(param[1], HUGE_FORMAT, |
157 | UnifInt((DSS_HUGE)P_SIZE_MIN, (DSS_HUGE)P_SIZE_MAX, qnum)); |
158 | pick_str(&p_types_set, qnum, param[3]); |
159 | ptr = param[3] + (int)strlen(param[3]); |
160 | while (*(ptr - 1) != ' ') ptr--; |
161 | strcpy(param[2], ptr); |
162 | pick_str(®ions, qnum, param[3]); |
163 | param[4][0] = '\0'; |
164 | break; |
165 | case 3: |
166 | pick_str(&c_mseg_set, qnum, param[1]); |
167 | /* |
168 | * pick a random offset within the month of march and add the |
169 | * appropriate magic numbers to position the output functions |
170 | * at the start of March '95 |
171 | */ |
172 | RANDOM(tmp_date, 0, 30, qnum); |
173 | strcpy(param[2], *(asc_date + tmp_date + 1155)); |
174 | param[3][0] = '\0'; |
175 | break; |
176 | case 4: |
177 | tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)58,qnum); |
178 | sprintf(param[1],formats[4], |
179 | 93 + tmp_date/12, tmp_date%12 + 1); |
180 | param[2][0] = '\0'; |
181 | break; |
182 | case 5: |
183 | pick_str(®ions, qnum, param[1]); |
184 | tmp_date = UnifInt((DSS_HUGE)93, (DSS_HUGE)97,qnum); |
185 | sprintf(param[2], formats[5], tmp_date); |
186 | param[3][0] = '\0'; |
187 | break; |
188 | case 6: |
189 | tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum); |
190 | sprintf(param[1], formats[6], tmp_date); |
191 | sprintf(param[2], formats[7], |
192 | UnifInt((DSS_HUGE)2, (DSS_HUGE)9, qnum)); |
193 | sprintf(param[3], HUGE_FORMAT, UnifInt((DSS_HUGE)24, (DSS_HUGE)25, qnum)); |
194 | param[4][0] = '\0'; |
195 | break; |
196 | case 7: |
197 | tmp_date = pick_str(&nations2, qnum, param[1]); |
198 | while (pick_str(&nations2, qnum, param[2]) == tmp_date); |
199 | param[3][0] = '\0'; |
200 | break; |
201 | case 8: |
202 | tmp_date = pick_str(&nations2, qnum, param[1]); |
203 | tmp_date = nations.list[tmp_date].weight; |
204 | strcpy(param[2], regions.list[tmp_date].text); |
205 | pick_str(&p_types_set, qnum, param[3]); |
206 | param[4][0] = '\0'; |
207 | break; |
208 | case 9: |
209 | pick_str(&colors, qnum, param[1]); |
210 | param[2][0] = '\0'; |
211 | break; |
212 | case 10: |
213 | tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)24,qnum); |
214 | sprintf(param[1],formats[10], |
215 | 93 + tmp_date/12, tmp_date%12 + 1); |
216 | param[2][0] = '\0'; |
217 | break; |
218 | case 11: |
219 | pick_str(&nations2, qnum, param[1]); |
220 | sprintf(param[2], "%11.10f" , Q11_FRACTION / flt_scale ); |
221 | param[3][0] = '\0'; |
222 | break; |
223 | case 12: |
224 | tmp_date = pick_str(&l_smode_set, qnum, param[1]); |
225 | while (tmp_date == pick_str(&l_smode_set, qnum, param[2])); |
226 | tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum); |
227 | sprintf(param[3], formats[12], tmp_date); |
228 | param[4][0] = '\0'; |
229 | break; |
230 | case 13: |
231 | pick_str(&q13a, qnum, param[1]); |
232 | pick_str(&q13b, qnum, param[2]); |
233 | param[3][0] = '\0'; |
234 | break; |
235 | case 14: |
236 | tmp_date = UnifInt((DSS_HUGE)0,(DSS_HUGE)59,qnum); |
237 | sprintf(param[1],formats[14], |
238 | 93 + tmp_date/12, tmp_date%12 + 1); |
239 | param[2][0] = '\0'; |
240 | break; |
241 | case 15: |
242 | tmp_date = UnifInt((DSS_HUGE)0,(DSS_HUGE)57,qnum); |
243 | sprintf(param[1],formats[15], |
244 | 93 + tmp_date/12, tmp_date%12 + 1); |
245 | param[2][0] = '\0'; |
246 | break; |
247 | case 16: |
248 | tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
249 | tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
250 | sprintf(param[1], formats[16], tmp1, tmp2); |
251 | pick_str(&p_types_set, qnum, param[2]); |
252 | ptr = param[2] + (int)strlen(param[2]); |
253 | while (*(--ptr) != ' '); |
254 | *ptr = '\0'; |
255 | lptr = &sizes[0]; |
256 | permute(lptr,50,qnum); |
257 | for (i=3; i <= MAX_PARAM; i++) |
258 | sprintf(param[i], "%ld" , sizes[i - 3]); |
259 | break; |
260 | case 17: |
261 | tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
262 | tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
263 | sprintf(param[1], formats[17], tmp1, tmp2); |
264 | pick_str(&p_cntr_set, qnum, param[2]); |
265 | param[3][0] = '\0'; |
266 | break; |
267 | case 18: |
268 | sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)312, (DSS_HUGE)315, qnum)); |
269 | param[2][0] = '\0'; |
270 | break; |
271 | case 19: |
272 | tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
273 | tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
274 | sprintf(param[1], formats[19], tmp1, tmp2); |
275 | tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
276 | tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
277 | sprintf(param[2], formats[19], tmp1, tmp2); |
278 | tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
279 | tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); |
280 | sprintf(param[3], formats[19], tmp1, tmp2); |
281 | sprintf(param[4], HUGE_FORMAT, UnifInt((DSS_HUGE)1, (DSS_HUGE)10, qnum)); |
282 | sprintf(param[5], HUGE_FORMAT, UnifInt((DSS_HUGE)10, (DSS_HUGE)20, qnum)); |
283 | sprintf(param[6], HUGE_FORMAT, UnifInt((DSS_HUGE)20, (DSS_HUGE)30, qnum)); |
284 | param[7][0] = '\0'; |
285 | break; |
286 | case 20: |
287 | pick_str(&colors, qnum, param[1]); |
288 | tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum); |
289 | sprintf(param[2], formats[20], tmp_date); |
290 | pick_str(&nations2, qnum, param[3]); |
291 | param[4][0] = '\0'; |
292 | break; |
293 | case 21: |
294 | pick_str(&nations2, qnum, param[1]); |
295 | param[2][0] = '\0'; |
296 | break; |
297 | case 22: |
298 | lptr = &ccode[0]; |
299 | permute(lptr,25, qnum); |
300 | for (i=0; i <= 7; i++) |
301 | sprintf(param[i+1], "%ld" , 10 + ccode[i]); |
302 | param[8][0] = '\0'; |
303 | break; |
304 | case 23: |
305 | case 24: |
306 | break; |
307 | default: |
308 | fprintf(stderr, |
309 | "No variable definitions available for query %d\n" , |
310 | qnum); |
311 | return; |
312 | } |
313 | } |
314 | |
315 | if (flags & LOG) |
316 | { |
317 | if (lfp == NULL) |
318 | { |
319 | lfp = fopen(lfile, "a" ); |
320 | OPEN_CHECK(lfp, lfile); |
321 | } |
322 | fprintf(lfp, "%d" , qnum); |
323 | for (i=1; i <= 10; i++) |
324 | if (flags & DFLT) |
325 | { |
326 | if (defaults[qnum - 1][i - 1] == NULL) |
327 | break; |
328 | else |
329 | fprintf(lfp, "\t%s" , defaults[qnum - 1][i - 1]); |
330 | } |
331 | else |
332 | { |
333 | if (param[i][0] == '\0') |
334 | break; |
335 | else |
336 | fprintf(lfp, "\t%s" , param[i]); |
337 | } |
338 | fprintf(lfp, "\n" ); |
339 | } |
340 | } |
341 | else |
342 | { |
343 | if (flags & DFLT) |
344 | { |
345 | /* to allow -d to work at all scale factors */ |
346 | if (qnum == 11 && vnum == 2) |
347 | fprintf(ofp, "%11.10f" , Q11_FRACTION/flt_scale); |
348 | else |
349 | if (defaults[qnum - 1][vnum - 1]) |
350 | fprintf(ofp, "%s" , defaults[qnum - 1][vnum - 1]); |
351 | else |
352 | fprintf(stderr, |
353 | "Bad default request (q: %d, p: %d)\n" , |
354 | qnum, vnum); |
355 | } |
356 | else |
357 | { |
358 | if (param[vnum] && vnum <= MAX_PARAM) |
359 | fprintf(ofp, "%s" , param[vnum]); |
360 | else |
361 | fprintf(stderr, "Bad parameter request (q: %d, p: %d)\n" , |
362 | qnum, vnum); |
363 | } |
364 | } |
365 | return; |
366 | } |
367 | |