1 
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <ctype.h>
5 #include <string.h>
6 #include "suck_config.h"
7 
8 /* create a text file with the default*phrases arrays in them */
9 /* and create phrases.h */
10 #define PHRASES_H "phrases.h"
11 
12 extern const char *default_both_phrases[];
13 extern const char *default_rpost_phrases[];
14 extern const char *default_test_phrases[];
15 extern const char *default_suck_phrases[];
16 extern const char *default_timer_phrases[];
17 extern const char *default_chkh_phrases[];
18 extern const char *default_dedupe_phrases[];
19 extern const char *default_killf_reasons[];
20 extern const char *default_killf_phrases[];
21 extern const char *default_killp_phrases[];
22 extern const char *default_sucku_phrases[];
23 extern const char *default_lmove_phrases[];
24 extern const char *default_active_phrases[];
25 extern const char *default_batch_phrases[];
26 extern const char *default_xover_phrases[];
27 extern const char *default_xover_reasons[];
28 
29 extern int nr_both_phrases;
30 extern int nr_rpost_phrases;
31 extern int nr_test_phrases;
32 extern int nr_suck_phrases;
33 extern int nr_timer_phrases;
34 extern int nr_chkh_phrases;
35 extern int nr_dedupe_phrases;
36 extern int nr_killf_reasons;
37 extern int nr_killf_phrases;
38 extern int nr_killp_phrases;
39 extern int nr_sucku_phrases;
40 extern int nr_lmove_phrases;
41 extern int nr_active_phrases;
42 extern int nr_batch_phrases;
43 extern int nr_xover_phrases;
44 extern int nr_xover_reasons;
45 
46 int do_one_array(FILE *, int, const char **);
47 int do_phrases_h(void);
48 int count_vars(const char **, int);
49 
main(int argc,char * argv[])50 int main(int argc, char *argv[]) {
51 
52 	int retval = 0;
53 	FILE *fpo;
54 
55 	if(argc != 2) {
56 		fprintf(stderr, "Usage: %s outfile <RETURN>\n", argv[0]);
57 		retval = -1;
58 	}
59 	else if(strcmp(argv[1],"phrases.h") == 0) {
60 		retval = do_phrases_h();
61 	}
62 	else if((fpo = fopen(argv[1], "w")) == NULL) {
63 		perror(argv[1]);
64 		retval = -1;
65 	}
66 	else {			/* first put version number */
67 		fprintf(fpo, "%s\n", SUCK_VERSION);
68 
69 		retval = do_one_array(fpo, nr_both_phrases, default_both_phrases);
70 		if(retval == 0) {
71 			retval = do_one_array(fpo, nr_rpost_phrases, default_rpost_phrases);
72 		}
73 		if(retval == 0) {
74 			retval = do_one_array(fpo, nr_test_phrases, default_test_phrases);
75 		}
76 		if(retval == 0) {
77 			retval = do_one_array(fpo, nr_suck_phrases, default_suck_phrases);
78 		}
79 		if(retval == 0) {
80 			retval = do_one_array(fpo, nr_timer_phrases, default_timer_phrases);
81 		}
82 		if(retval == 0) {
83 			retval = do_one_array(fpo, nr_chkh_phrases, default_chkh_phrases);
84 		}
85 		if(retval == 0) {
86 			retval = do_one_array(fpo, nr_dedupe_phrases, default_dedupe_phrases);
87 		}
88 		if(retval == 0) {
89 			retval = do_one_array(fpo, nr_killf_reasons, default_killf_reasons);
90 		}
91 		if(retval == 0) {
92 			retval = do_one_array(fpo, nr_killf_phrases, default_killf_phrases);
93 		}
94 		if(retval == 0) {
95 			retval = do_one_array(fpo, nr_killp_phrases, default_killp_phrases);
96 		}
97 		if(retval == 0) {
98 			retval = do_one_array(fpo, nr_sucku_phrases, default_sucku_phrases);
99 		}
100 		if(retval == 0) {
101 			retval = do_one_array(fpo, nr_lmove_phrases, default_lmove_phrases);
102 		}
103 		if(retval == 0) {
104 			retval = do_one_array(fpo, nr_active_phrases, default_active_phrases);
105 		}
106 		if(retval == 0) {
107 			retval = do_one_array(fpo, nr_batch_phrases, default_batch_phrases);
108 		}
109 		if(retval == 0) {
110 			retval = do_one_array(fpo, nr_xover_phrases, default_xover_phrases);
111 		}
112 		if(retval == 0) {
113 			retval = do_one_array(fpo, nr_xover_reasons, default_xover_reasons);
114 		}
115 
116 		fclose(fpo);
117 		if(retval == -1 ) {
118 			perror(argv[1]);
119 		}
120 		else {
121 			printf("Created %s\n", argv[1]);
122 		}
123 	}
124 	exit(retval);
125 }
126 /*------------------------------------------------------------------------*/
do_one_array(FILE * fpo,int nr,const char ** phrases)127 int do_one_array(FILE *fpo, int nr, const char **phrases) {
128 	int i, x;
129 	int retval = 0;
130 
131 	for(i=0;i<nr && retval == 0;i++) {
132 		fputc('"', fpo);
133 		for(x = 0; x < strlen(phrases[i]); x++) {
134 			/* handle control codes */
135 			switch(phrases[i][x]) {
136 			   case '\r':
137 				fputs("\\r", fpo);
138 				break;
139 			   case '\t':
140 				fputs("\\t", fpo);
141 				break;
142 			   case '\n':
143 				fputs("\\n", fpo);
144 				break;
145 			   default:
146 				fputc(phrases[i][x], fpo);
147 				break;
148 			}
149 		}
150 		if(fputs("\"\n", fpo) == EOF) {
151 			retval = -1;
152 		}
153 	}
154 	return retval;
155 }
156 /*------------------------------------------------------------------------*/
do_phrases_h(void)157 int do_phrases_h(void) {
158 
159 	FILE *fpo;
160 	int i, maxvar, retval = 0;
161 	/* generate phrases.h */
162 	if((fpo = fopen(PHRASES_H, "w")) == NULL) {
163 		perror(PHRASES_H);
164 		retval = -1;
165 	}
166 	else {
167 		maxvar = count_vars(default_both_phrases, nr_both_phrases);
168 		i = count_vars(default_rpost_phrases, nr_rpost_phrases);
169 		if( i > maxvar) {
170 			maxvar = i;
171 		}
172 		i = count_vars(default_test_phrases, nr_test_phrases);
173 		if( i > maxvar) {
174 			maxvar = i;
175 		}
176 		i = count_vars(default_suck_phrases, nr_suck_phrases);
177 		if( i > maxvar) {
178 			maxvar = i;
179 		}
180 		i = count_vars(default_timer_phrases, nr_timer_phrases);
181 		if( i > maxvar) {
182 			maxvar = i;
183 		}
184 		i = count_vars(default_chkh_phrases, nr_chkh_phrases);
185 		if( i > maxvar) {
186 			maxvar = i;
187 		}
188 		i = count_vars(default_dedupe_phrases, nr_dedupe_phrases);
189 		if( i > maxvar) {
190 			maxvar = i;
191 		}
192 		i = count_vars(default_killf_reasons, nr_killf_reasons);
193 		if( i > maxvar) {
194 			maxvar = i;
195 		}
196 		i = count_vars(default_killf_phrases, nr_killf_phrases);
197 		if( i > maxvar) {
198 			maxvar = i;
199 		}
200 		i = count_vars(default_sucku_phrases, nr_sucku_phrases);
201 		if( i > maxvar) {
202 			maxvar = i;
203 		}
204 		i = count_vars(default_lmove_phrases, nr_lmove_phrases);
205 		if( i > maxvar) {
206 			maxvar = i;
207 		}
208 		i = count_vars(default_active_phrases, nr_active_phrases);
209 		if(i > maxvar) {
210 			maxvar = i;
211 		}
212 		i = count_vars(default_batch_phrases, nr_batch_phrases);
213 		if(i > maxvar) {
214 			maxvar = i;
215 		}
216 		i = count_vars(default_xover_phrases, nr_xover_phrases);
217 		if(i > maxvar) {
218 			maxvar = i;
219 		}
220 		i = count_vars(default_xover_reasons, nr_xover_reasons);
221 		if(i > maxvar) {
222 			maxvar = i;
223 		}
224 
225 		fprintf(fpo, "/* AUTOMATICALLY GENERATED BY makephrases */\n\n");
226 		fprintf(fpo, "#define NR_BOTH_PHRASES %d\n", nr_both_phrases);
227 		fprintf(fpo, "#define NR_RPOST_PHRASES %d\n", nr_rpost_phrases);
228 		fprintf(fpo, "#define NR_TEST_PHRASES %d\n", nr_test_phrases);
229 		fprintf(fpo, "#define NR_SUCK_PHRASES %d\n", nr_suck_phrases);
230 		fprintf(fpo, "#define NR_TIMER_PHRASES %d\n", nr_timer_phrases);
231 		fprintf(fpo, "#define NR_CHKH_PHRASES %d\n", nr_chkh_phrases);
232 		fprintf(fpo, "#define NR_DEDUPE_PHRASES %d\n", nr_dedupe_phrases);
233 		fprintf(fpo, "#define NR_KILLF_REASONS %d\n", nr_killf_reasons);
234 		fprintf(fpo, "#define NR_KILLF_PHRASES %d\n", nr_killf_phrases);
235 		fprintf(fpo, "#define NR_KILLP_PHRASES %d\n", nr_killp_phrases);
236 		fprintf(fpo, "#define NR_SUCKU_PHRASES %d\n", nr_sucku_phrases);
237 		fprintf(fpo, "#define NR_LMOVE_PHRASES %d\n", nr_lmove_phrases);
238 		fprintf(fpo, "#define NR_ACTIVE_PHRASES %d\n", nr_active_phrases);
239 		fprintf(fpo, "#define NR_BATCH_PHRASES %d\n", nr_batch_phrases);
240 		fprintf(fpo, "#define NR_XOVER_PHRASES %d\n", nr_xover_phrases);
241 		fprintf(fpo, "#define NR_XOVER_REASONS %d\n", nr_xover_reasons);
242 
243 		fprintf(fpo, "#define PHRASES_MAX_NR_VARS %d\n\n", maxvar);
244 
245 		fprintf(fpo, "extern char *default_both_phrases[];\n");
246 		fprintf(fpo, "extern char *default_rpost_phrases[];\n");
247 		fprintf(fpo, "extern char *default_test_phrases[];\n");
248 		fprintf(fpo, "extern char *default_suck_phrases[];\n");
249 		fprintf(fpo, "extern char *default_timer_phrases[];\n");
250 		fprintf(fpo, "extern char *default_chkh_phrases[];\n");
251 		fprintf(fpo, "extern char *default_dedupe_phrases[];\n");
252 		fprintf(fpo, "extern char *default_killf_reasons[];\n");
253 		fprintf(fpo, "extern char *default_killf_phrases[];\n");
254 		fprintf(fpo, "extern char *default_killp_phrases[];\n");
255 		fprintf(fpo, "extern char *default_sucku_phrases[];\n");
256 		fprintf(fpo, "extern char *default_lmove_phrases[];\n");
257 		fprintf(fpo, "extern char *default_active_phrases[];\n");
258 		fprintf(fpo, "extern char *default_batch_phrases[];\n");
259 		fprintf(fpo, "extern char *default_xover_phrases[];\n");
260 		fprintf(fpo, "extern char *default_xover_reasons[];\n");
261 
262 
263 		fprintf(fpo, "extern char **both_phrases;\n");
264 		fprintf(fpo, "extern char **rpost_phrases;\n");
265 		fprintf(fpo, "extern char **test_phrases;\n");
266 		fprintf(fpo, "extern char **suck_phrases;\n");
267 		fprintf(fpo, "extern char **timer_phrases;\n");
268 		fprintf(fpo, "extern char **chkh_phrases;\n");
269 		fprintf(fpo, "extern char **dedupe_phrases;\n");
270 		fprintf(fpo, "extern char **killf_reasons;\n");
271 		fprintf(fpo, "extern char **killf_phrases;\n");
272 		fprintf(fpo, "extern char **killp_phrases;\n");
273 		fprintf(fpo, "extern char **sucku_phrases;\n");
274 		fprintf(fpo, "extern char **lmove_phrases;\n");
275 		fprintf(fpo, "extern char **active_phrases;\n");
276 		fprintf(fpo, "extern char **batch_phrases;\n");
277 		fprintf(fpo, "extern char **xover_phrases;\n");
278 		fprintf(fpo, "extern char **xover_reasons;\n");
279 
280 		fclose(fpo);
281 
282 		printf("Created phrases.h\n");
283 	}
284 	return retval;
285 }
286 /*--------------------------------------------------------------*/
287 /* find highest nr of vars in any string in the array 		*/
288 /* var == %v#%							*/
289 /*--------------------------------------------------------------*/
count_vars(const char ** phrases,int nr)290 int count_vars(const char **phrases, int nr) {
291 
292 	int i, x, max, nrline, match, nrat, len;
293 
294 	max = 0;
295 	for(i=0;i<nr;i++) {
296 		x = 0;
297 		nrline = 0;
298 		len = strlen(phrases[i]);
299 		while( x < len-3 ) {
300 			match = 0;
301 			if(phrases[i][x] == PHRASES_SEPARATOR && phrases[i][x+1] == PHRASES_VAR_CHAR) {
302 				nrat = x+2;
303 				while(isdigit(phrases[i][nrat])) {
304 					nrat++;
305 				}
306 				if((x < len-3) && (nrat > x+2) && (phrases[i][nrat] == PHRASES_SEPARATOR)) {
307 					match = 1;
308 					nrline++;
309 					x = nrat+1;
310 				}
311 			}
312 			if (match == 0) {
313 				x++;
314 			}
315 		}
316 		if(nrline > max) {
317 			max = nrline;
318 		}
319 
320 	}
321 	return max;
322 }
323