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