Commit | Line | Data |
---|---|---|
970ed795 | 1 | /////////////////////////////////////////////////////////////////////////////// |
3abe9331 | 2 | // Copyright (c) 2000-2015 Ericsson Telecom AB |
970ed795 EL |
3 | // All rights reserved. This program and the accompanying materials |
4 | // are made available under the terms of the Eclipse Public License v1.0 | |
5 | // which accompanies this distribution, and is available at | |
6 | // http://www.eclipse.org/legal/epl-v10.html | |
7 | /////////////////////////////////////////////////////////////////////////////// | |
8 | #include <stdio.h> | |
9 | #include <stdlib.h> | |
10 | #include <unistd.h> | |
11 | #include <dirent.h> | |
12 | #include <time.h> | |
13 | #include <string.h> | |
14 | #include <sys/stat.h> | |
15 | ||
16 | #include "repgen.h" | |
17 | ||
18 | #ifndef LOGFORMAT | |
19 | #define LOGFORMAT "ttcn3_logformat -s" | |
20 | #endif /* LOGFORMAT */ | |
21 | ||
22 | static const unsigned char logo[] = { | |
23 | 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x64, 0x00, 0x1B, 0x00, | |
24 | 0xF2, 0x00, 0x00, 0x40, 0x66, 0xCC, 0x80, 0x99, 0xCC, 0xA2, | |
25 | 0xA8, 0xE9, 0xBF, 0xCC, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, | |
26 | 0xFF, 0xE1, 0xE9, 0xF3, 0x4E, 0x92, 0xCB, 0x2C, 0x00, 0x00, | |
27 | 0x00, 0x00, 0x64, 0x00, 0x1B, 0x00, 0x00, 0x03, 0xFE, 0x08, | |
28 | 0xBA, 0xDC, 0xFE, 0x30, 0xCA, 0x49, 0xAB, 0xBD, 0x38, 0xEB, | |
29 | 0xCD, 0xBB, 0xFF, 0x60, 0x28, 0x8E, 0x64, 0x69, 0x9E, 0x68, | |
30 | 0x3A, 0x0A, 0x83, 0xA1, 0xBE, 0xE1, 0x31, 0x10, 0x34, 0x21, | |
31 | 0xC0, 0xB8, 0xD6, 0xD2, 0x45, 0x41, 0x07, 0xB9, 0xE0, 0x24, | |
32 | 0x50, 0xE3, 0x11, 0x0C, 0x37, 0xA1, 0xF2, 0x41, 0x2C, 0xDA, | |
33 | 0x0E, 0x00, 0xA8, 0x26, 0xC0, 0x1A, 0xB0, 0x92, 0x03, 0xAB, | |
34 | 0x15, 0x08, 0x08, 0x0C, 0xB8, 0x00, 0x81, 0xA1, 0x95, 0xF4, | |
35 | 0x8E, 0xCB, 0xAD, 0xEC, 0xC2, 0x8C, 0x5C, 0x54, 0xDD, 0x83, | |
36 | 0x48, 0x93, 0xF0, 0x8D, 0x8A, 0x09, 0x05, 0xB0, 0x45, 0xE0, | |
37 | 0x8C, 0xF3, 0x8F, 0x06, 0x34, 0x50, 0x3F, 0x5D, 0x34, 0x63, | |
38 | 0x33, 0x00, 0x33, 0x36, 0x2D, 0x85, 0x74, 0x62, 0x0A, 0x8A, | |
39 | 0x77, 0x04, 0x0A, 0x35, 0x2E, 0x00, 0x34, 0x12, 0x01, 0x5C, | |
40 | 0x01, 0x81, 0x45, 0x71, 0x18, 0x33, 0x49, 0x6E, 0x47, 0x0A, | |
41 | 0x81, 0x40, 0x34, 0x37, 0x34, 0x9F, 0x0B, 0xAA, 0x0C, 0x81, | |
42 | 0xAB, 0x8D, 0x52, 0xAF, 0x97, 0x3E, 0x04, 0xA7, 0x04, 0x52, | |
43 | 0x10, 0x5E, 0x4E, 0x86, 0xB9, 0x16, 0x33, 0x48, 0x54, 0x40, | |
44 | 0x7C, 0x06, 0x9A, 0x84, 0xA8, 0x44, 0x05, 0xBE, 0x89, 0x3E, | |
45 | 0x75, 0x61, 0x3E, 0xC5, 0x0A, 0x02, 0x05, 0x96, 0xCF, 0x2E, | |
46 | 0x78, 0x81, 0xD7, 0x93, 0x11, 0x9D, 0xB5, 0xAA, 0x7A, 0x17, | |
47 | 0x33, 0x3D, 0xCD, 0x5D, 0xB5, 0x3D, 0x5C, 0x78, 0x02, 0x01, | |
48 | 0x3E, 0x0F, 0x81, 0x3D, 0x96, 0x8A, 0x3E, 0x32, 0x74, 0x6B, | |
49 | 0xEC, 0x3F, 0xA8, 0xF2, 0x10, 0x7F, 0x3E, 0x05, 0xCE, 0x54, | |
50 | 0x1A, 0x7C, 0xBE, 0x68, 0x82, 0x32, 0xCD, 0x56, 0x27, 0x4A, | |
51 | 0x36, 0x92, 0x81, 0x1B, 0x95, 0x47, 0xC1, 0x81, 0x26, 0x2C, | |
52 | 0x48, 0x49, 0xA3, 0x46, 0xEB, 0xC0, 0x34, 0x03, 0xEC, 0x74, | |
53 | 0x61, 0xDB, 0xA4, 0x7C, 0xC8, 0x46, 0x86, 0x19, 0x03, 0xA0, | |
54 | 0x48, 0xF9, 0x13, 0x85, 0x10, 0xC6, 0x1B, 0xD9, 0xF4, 0x48, | |
55 | 0x39, 0x80, 0x47, 0x13, 0xAB, 0x84, 0x84, 0x00, 0xF8, 0x48, | |
56 | 0x65, 0x8B, 0x56, 0x4C, 0x08, 0x22, 0x77, 0x8C, 0xA3, 0x87, | |
57 | 0x81, 0x8F, 0xB7, 0x49, 0x24, 0x01, 0xCC, 0x0A, 0x74, 0xE3, | |
58 | 0x40, 0xA7, 0x1A, 0x42, 0x9D, 0x24, 0x72, 0x02, 0x45, 0x11, | |
59 | 0x46, 0x89, 0x78, 0xA0, 0x24, 0xDB, 0x16, 0xE1, 0x8F, 0x91, | |
60 | 0x99, 0x53, 0xB2, 0x64, 0x11, 0x70, 0xC3, 0x0B, 0x9A, 0x1B, | |
61 | 0x2C, 0xC0, 0xB0, 0x38, 0xD4, 0x45, 0xAB, 0x00, 0xA9, 0x66, | |
62 | 0x73, 0x99, 0xB1, 0x02, 0x07, 0xCE, 0xD9, 0x08, 0xBC, 0xE8, | |
63 | 0x2C, 0x5C, 0xB2, 0xC4, 0xEA, 0x91, 0xB7, 0x74, 0xF3, 0x36, | |
64 | 0x40, 0xA6, 0xB7, 0xAF, 0xDF, 0xBF, 0x80, 0x03, 0x0B, 0x1E, | |
65 | 0x4C, 0xB8, 0xB0, 0xE1, 0xC3, 0x12, 0x12, 0x00, 0x00, 0x3B }; | |
66 | ||
67 | ||
68 | ||
69 | ||
70 | ||
71 | static int GetIndent ( char *buf, int buflen, int indent, int comment ) | |
72 | { | |
73 | /* char *ctemp;*/ | |
74 | int i; | |
75 | ||
76 | ||
77 | for ( i = 0; i < buflen; i++ ) | |
78 | { | |
79 | switch ( buf[i] ) | |
80 | { | |
81 | case '/': | |
82 | if ( ( i < buflen ) && ( buf[++i] == '*') ) comment++; | |
83 | if ( ( i < buflen ) && ( buf[i+1] == '/') ) return indent; | |
84 | break; | |
85 | ||
86 | case '*': | |
87 | if ( ( i < buflen ) && ( buf[++i] == '/') ) comment--; | |
88 | break; | |
89 | ||
90 | case '{': | |
91 | if ( ! comment ) indent++; | |
92 | break; | |
93 | ||
94 | case '}': | |
95 | if ( ! comment ) indent--; | |
96 | break; | |
97 | } | |
98 | } | |
99 | ||
100 | return indent; | |
101 | } | |
102 | ||
103 | ||
104 | static int TruncateLine ( char *inbuf, int inbuflen, int tablen, int fillcol, FILE *wfile ) | |
105 | { | |
106 | int i, colnum = 0, bufpos; | |
107 | char *buf = malloc(inbuflen+20*tablen+1); | |
108 | if(buf == NULL) { | |
109 | fprintf(stderr, "malloc() failed.\n"); | |
110 | exit(2); | |
111 | } | |
112 | ||
113 | bufpos = 0; | |
114 | for ( i = 0; i < inbuflen; i++ ) | |
115 | { | |
116 | buf[bufpos] = inbuf[i]; | |
117 | if ( buf[bufpos] == ' ' ) colnum = bufpos + 1; | |
118 | else if ( buf[bufpos] == '\n' ) | |
119 | { | |
120 | buf[bufpos+1] = '\0'; | |
121 | fputs ( buf, wfile ); | |
122 | colnum = 0; | |
123 | bufpos = -1; | |
124 | } | |
125 | else if ( buf[bufpos] == '\t' ) | |
126 | { | |
127 | int j; | |
128 | for ( j = 0; j < tablen; j++ ) buf[bufpos+j] = ' '; | |
129 | colnum += tablen; | |
130 | bufpos += tablen-1; | |
131 | } | |
132 | if ( ( bufpos >= fillcol ) && colnum ) | |
133 | { | |
134 | buf[colnum-1] = '\0'; | |
135 | fputs ( buf, wfile ); | |
136 | putc ( '\n', wfile ); | |
137 | bufpos -= colnum; | |
138 | strncpy ( buf, buf + colnum, bufpos + 1 ); | |
139 | colnum = 0; | |
140 | } | |
141 | bufpos++; | |
142 | } | |
143 | free(buf); | |
144 | return 0; | |
145 | } | |
146 | ||
147 | ||
148 | int WriteCode ( struct listentry *first, char *code_srcdir, char *code_dstdir, int tablen, int fillcol ) | |
149 | { | |
150 | char *ctemp; | |
151 | /* char dirname[256];*/ | |
152 | DIR *opdir; | |
153 | struct listentry *tclist; | |
154 | struct dirent *dp; | |
155 | ||
156 | if ( code_srcdir[strlen(code_srcdir)-1] == '/' ) code_srcdir[strlen(code_srcdir)-1] = '\0'; | |
157 | ||
158 | opdir = opendir ( code_srcdir ); | |
159 | if ( !opdir ) | |
160 | { | |
161 | perror ( code_srcdir ); | |
162 | return -1; | |
163 | } | |
164 | ||
165 | for ( dp = readdir ( opdir ); dp != NULL; dp = readdir ( opdir ) ) | |
166 | { | |
167 | ctemp = strrchr ( dp->d_name, '.' ); | |
168 | if ( ctemp && ( strcmp ( ctemp, ".ttcn" ) == 0 ) ) | |
169 | { | |
170 | char fullname[MAXLEN]; | |
171 | char inbuf[1024]; | |
172 | FILE *rfile, *wfile; | |
173 | ||
174 | sprintf ( fullname, "%s/%s", code_srcdir, dp->d_name ); | |
175 | if ( ( rfile = fopen ( fullname, "rt") ) == NULL ) | |
176 | { | |
177 | perror ( fullname ); | |
178 | return -1; | |
179 | } | |
180 | ||
181 | while ( fgets ( inbuf, sizeof ( inbuf ), rfile ) != NULL ) | |
182 | { | |
183 | ctemp = strchr ( inbuf, 't' ); | |
184 | if ( ctemp && ( strncmp ( ctemp, "testcase", 8 ) == 0 ) ) | |
185 | { | |
186 | tclist = first; | |
187 | while ( tclist->next != NULL ) | |
188 | { | |
189 | ctemp = strchr ( inbuf, tclist->tcname[0] ); | |
190 | if ( ctemp && ( strncmp ( ctemp, tclist->tcname, strlen ( tclist->tcname ) ) == 0 ) ) | |
191 | { | |
192 | int indent = 0, comment = 0; | |
193 | int started = 0, needed = 1; | |
194 | ||
195 | sprintf ( fullname, "%s/%s.ttcn", code_dstdir, tclist->tcname ); | |
196 | if ( ( wfile = fopen ( fullname, "wt") ) == NULL ) | |
197 | { | |
198 | perror ( fullname ); | |
199 | return -1; | |
200 | } | |
201 | ||
202 | indent = GetIndent ( inbuf, strlen ( inbuf ), indent, comment ); | |
203 | if ( indent ) started = 1; | |
204 | TruncateLine ( inbuf, strlen ( inbuf ), tablen, fillcol, wfile ); | |
205 | while ( needed ) | |
206 | { | |
207 | if ( fgets ( inbuf, sizeof ( inbuf ), rfile ) == NULL ) break; | |
208 | indent = GetIndent ( inbuf, strlen ( inbuf ), indent, comment ); | |
209 | if ( ! started && indent ) started = 1; | |
210 | if ( started && ! indent ) needed = 0; | |
211 | TruncateLine ( inbuf, strlen ( inbuf ), tablen, fillcol, wfile ); | |
212 | } | |
213 | fclose ( wfile ); | |
214 | } | |
215 | tclist = tclist->next; | |
216 | } | |
217 | } | |
218 | } | |
219 | ||
220 | fclose ( rfile ); | |
221 | } | |
222 | } | |
223 | ||
224 | if ( closedir ( opdir ) != 0 ) | |
225 | { | |
226 | perror ( code_srcdir ); | |
227 | return -1; | |
228 | } | |
229 | ||
230 | return 0; | |
231 | } | |
232 | ||
233 | ||
234 | int WriteLog ( struct listentry *first, char *log_srcdir, char *log_dstdir ) | |
235 | { | |
236 | char cwd[MAXLEN], command[MAXLEN], log_absrcdir[MAXLEN]; | |
237 | char oldname[MAXLEN], newname[MAXLEN], tempdir[MAXLEN]; | |
238 | int used; | |
239 | DIR *opdir; | |
240 | struct listentry *tclist; | |
241 | struct dirent *dp; | |
242 | ||
243 | sprintf ( tempdir, "%s/temp", log_dstdir ); | |
244 | mkdir ( tempdir | |
245 | #ifndef MINGW | |
246 | , S_IRWXU | |
247 | #endif | |
248 | ); | |
249 | ||
250 | if ( getcwd ( cwd, sizeof ( cwd ) ) == NULL ) | |
251 | { | |
252 | remove ( tempdir ); | |
253 | perror ( "getcwd" ); | |
254 | return -1; | |
255 | } | |
256 | ||
257 | if ( ( log_srcdir[0] == '.' ) && ( ( log_srcdir[1] == '/' ) || ( log_srcdir[1] == '\0' ) ) ) | |
258 | { | |
259 | char *ctemp; | |
260 | ctemp = &log_srcdir[1]; | |
261 | strcpy (log_absrcdir, cwd); | |
262 | strcat (log_absrcdir, ctemp); | |
263 | } | |
264 | else strcpy ( log_absrcdir, log_srcdir ); | |
265 | ||
266 | if ( log_absrcdir[strlen(log_absrcdir)-1] == '/' ) log_absrcdir[strlen(log_absrcdir)-1] = '\0'; | |
267 | ||
268 | opdir = opendir ( log_absrcdir ); | |
269 | if ( !opdir ) | |
270 | { | |
271 | remove ( tempdir ); | |
272 | perror ( log_absrcdir ); | |
273 | return -1; | |
274 | } | |
275 | ||
276 | if ( chdir ( tempdir ) == -1 ) | |
277 | { | |
278 | remove ( tempdir ); | |
279 | perror ( tempdir ); | |
280 | return -1; | |
281 | } | |
282 | ||
283 | for ( dp = readdir ( opdir ); dp != NULL; dp = readdir ( opdir ) ) | |
284 | { | |
285 | char *ctemp; | |
286 | ||
287 | ctemp = strrchr ( dp->d_name, '.' ); | |
288 | if ( ctemp && ( strcmp ( ctemp, ".log" ) == 0 ) ) | |
289 | { | |
290 | sprintf ( command, LOGFORMAT " %s/%s >/dev/null 2>&1", log_absrcdir, dp->d_name); | |
291 | if ( system ( command ) == -1 ) | |
292 | { | |
293 | remove ( tempdir ); | |
294 | perror ( command ); | |
295 | return -1; | |
296 | } | |
297 | } | |
298 | } | |
299 | ||
300 | closedir ( opdir ); | |
301 | ||
302 | if ( chdir ( cwd ) == -1 ) | |
303 | { | |
304 | remove ( tempdir ); | |
305 | perror ( cwd ); | |
306 | return -1; | |
307 | } | |
308 | ||
309 | opdir = opendir ( tempdir ); | |
310 | if ( !opdir ) | |
311 | { | |
312 | remove ( tempdir ); | |
313 | perror ( tempdir ); | |
314 | return -1; | |
315 | } | |
316 | ||
317 | for ( dp = readdir ( opdir ); dp != NULL; dp = readdir ( opdir ) ) | |
318 | { | |
319 | used = 0; | |
320 | ||
321 | if ( ( strcmp ( dp->d_name, ".." ) == 0 ) || ( strcmp ( dp->d_name, "." ) == 0 ) ) continue; | |
322 | ||
323 | tclist = first; | |
324 | while ( ( tclist->next != NULL ) && !used ) | |
325 | { | |
326 | if ( strcmp ( dp->d_name, tclist->tcname ) == 0 ) | |
327 | { | |
328 | used = 1; | |
329 | sprintf ( oldname, "%s/temp/%s", log_dstdir, tclist->tcname ); | |
330 | sprintf ( newname, "%s/%s.ttcnlog", log_dstdir, tclist->tcname ); | |
331 | if ( rename ( oldname, newname ) == -1 ) | |
332 | { | |
333 | remove ( tempdir ); | |
334 | perror ( "rename" ); | |
335 | return -1; | |
336 | } | |
337 | } | |
338 | tclist = tclist->next; | |
339 | } | |
340 | ||
341 | if ( ! used ) | |
342 | { | |
343 | sprintf ( oldname, "%s/temp/%s", log_dstdir, dp->d_name ); | |
344 | remove ( oldname ); | |
345 | } | |
346 | } | |
347 | ||
348 | if ( remove ( tempdir ) == -1 ) | |
349 | { | |
350 | perror ( tempdir ); | |
351 | return -1; | |
352 | } | |
353 | ||
354 | if ( closedir ( opdir ) != 0 ) | |
355 | { | |
356 | perror ( log_srcdir ); | |
357 | return -1; | |
358 | } | |
359 | ||
360 | return 0; | |
361 | } | |
362 | ||
363 | ||
364 | int WriteDump ( struct listentry *first, char *dump_srcdir, char *dump_dstdir, int tablen, int fillcol ) | |
365 | { | |
366 | /* char *ctemp; | |
367 | char dirname[256];*/ | |
368 | char fullname[MAXLEN]; | |
369 | DIR *opdir; | |
370 | struct listentry *tclist; | |
371 | struct dirent *dp; | |
372 | ||
373 | if ( dump_srcdir[strlen(dump_srcdir)-1] == '/' ) dump_srcdir[strlen(dump_srcdir)-1] = '\0'; | |
374 | ||
375 | opdir = opendir ( dump_srcdir ); | |
376 | if ( !opdir ) | |
377 | { | |
378 | perror ( dump_srcdir ); | |
379 | return -1; | |
380 | } | |
381 | ||
382 | for ( dp = readdir ( opdir ); dp != NULL; dp = readdir ( opdir ) ) | |
383 | { | |
384 | if ( ( strcmp ( dp->d_name, ".." ) == 0 ) || ( strcmp ( dp->d_name, "." ) == 0 ) ) continue; | |
385 | ||
386 | tclist = first; | |
387 | while ( tclist->next != NULL ) | |
388 | { | |
389 | sprintf ( fullname, "%s.dump", tclist->tcname ); | |
390 | if ( strcmp ( dp->d_name, fullname ) == 0 ) | |
391 | { | |
392 | char inbuf[1024]; | |
393 | FILE *rfile, *wfile; | |
394 | ||
395 | sprintf ( fullname, "%s/%s", dump_srcdir, dp->d_name ); | |
396 | if ( ( rfile = fopen ( fullname, "rt") ) == NULL ) | |
397 | { | |
398 | perror ( fullname ); | |
399 | return -1; | |
400 | } | |
401 | ||
402 | sprintf ( fullname, "%s/%s.dump", dump_dstdir, tclist->tcname ); | |
403 | if ( ( wfile = fopen ( fullname, "wt") ) == NULL ) | |
404 | { | |
405 | perror ( fullname ); | |
406 | return -1; | |
407 | } | |
408 | ||
409 | while ( fgets ( inbuf, sizeof ( inbuf ), rfile ) != NULL ) | |
410 | { | |
411 | GetIndent ( inbuf, strlen ( inbuf ), 0, 0 ); | |
412 | TruncateLine ( inbuf, strlen ( inbuf ), tablen, fillcol, wfile ); | |
413 | } | |
414 | fclose ( rfile ); | |
415 | fclose ( wfile ); | |
416 | } | |
417 | tclist = tclist->next; | |
418 | } | |
419 | } | |
420 | ||
421 | if ( closedir ( opdir ) != 0 ) | |
422 | { | |
423 | perror ( dump_srcdir ); | |
424 | return -1; | |
425 | } | |
426 | ||
427 | return 0; | |
428 | } | |
429 | ||
430 | ||
431 | int Genhtml ( struct listentry *first, char *title, char *data_dstdir ) | |
432 | { | |
433 | char *ctemp; | |
434 | char dirname[MAXLEN], filename[MAXLEN], buf[1024]; | |
435 | time_t tval; | |
436 | struct listentry *tclist; | |
437 | FILE *rfile, *wfile; | |
438 | /* int i;*/ | |
439 | ||
440 | sprintf ( buf, "%s.html", data_dstdir ); | |
441 | if ( ( wfile = fopen ( buf, "wt" ) ) == NULL ) | |
442 | { | |
443 | perror ( buf ); | |
444 | return -1; | |
445 | } | |
446 | ||
447 | ctemp = strrchr ( data_dstdir, '/' ); | |
448 | strcpy ( dirname, ctemp + 1 ); | |
449 | ||
450 | fprintf(wfile, "<html>\n" | |
451 | "<head>\n" | |
452 | "<title>TTCN-3 Test report</title>\n" | |
453 | "</head>\n" | |
454 | "<body>\n" | |
455 | " <IMG src=\"%s/logo.gif\">\n" | |
456 | " <script type=\"text/javascript\">\n", dirname); | |
457 | ||
458 | fputs ( "adatok = new Array (", wfile ); | |
459 | ||
460 | tclist = first; | |
461 | while ( tclist->next != NULL ) | |
462 | { | |
463 | sprintf ( buf, "\"%s\", ", tclist->tcname ); | |
464 | fputs ( buf, wfile ); | |
465 | ||
466 | sprintf ( filename, "%s/%s.short", data_dstdir, tclist->tcname ); | |
467 | sprintf ( buf, "\"./%s/%s.short\", ", dirname, tclist->tcname ); | |
468 | if ( access ( filename, R_OK ) == 0 ) fputs ( buf, wfile ); | |
469 | else fputs ( "\"\", ", wfile ); | |
470 | ||
471 | sprintf ( filename, "%s/%s.long", data_dstdir, tclist->tcname ); | |
472 | sprintf ( buf, "\"./%s/%s.long\", ", dirname, tclist->tcname ); | |
473 | if ( access ( filename, R_OK ) == 0 ) fputs ( buf, wfile ); | |
474 | else fputs ( "\"\", ", wfile ); | |
475 | ||
476 | sprintf ( filename, "%s/%s.ttcn", data_dstdir, tclist->tcname ); | |
477 | sprintf ( buf, "\"./%s/%s.ttcn\", ", dirname, tclist->tcname ); | |
478 | if ( access ( filename, R_OK ) == 0 ) fputs ( buf, wfile ); | |
479 | else fputs ( "\"\", ", wfile ); | |
480 | ||
481 | sprintf ( filename, "%s/%s.ttcnlog", data_dstdir, tclist->tcname ); | |
482 | sprintf ( buf, "\"./%s/%s.ttcnlog\", ", dirname, tclist->tcname ); | |
483 | if ( access ( filename, R_OK ) == 0 ) fputs ( buf, wfile ); | |
484 | else fputs ( "\"\", ", wfile ); | |
485 | ||
486 | sprintf ( filename, "%s/%s.dump", data_dstdir, tclist->tcname ); | |
487 | sprintf ( buf, "\"./%s/%s.dump\",\n", dirname, tclist->tcname ); | |
488 | if ( access ( filename, R_OK ) == 0 ) fputs ( buf, wfile ); | |
489 | else fputs ( "\"\",\n", wfile ); | |
490 | ||
491 | tclist = tclist->next; | |
492 | } | |
493 | ||
494 | fprintf ( wfile, "\"\" );\nmtitle=\"Test suite: %s\";\n", title ); | |
495 | ||
496 | fputs (" egyelem=6;\n" | |
497 | " tcszam=(adatok.length-1) / egyelem;\n" | |
498 | " kijelolt=new Array(1,1,1,1);\n" | |
499 | "\n" | |
500 | " function tcChange()\n" | |
501 | " {\n" | |
502 | " document.myForm.showOption.length=0;\n" | |
503 | " index=document.myForm.testchoose.selectedIndex;\n" | |
504 | " if (index!=-1)\n" | |
505 | " {\n" | |
506 | " if (adatok[index*egyelem+2]!=\"\")\n" | |
507 | " {\n" | |
508 | " elem = new Option(\"Detailed description\", adatok[index*egyelem+2], false, kijelolt[0]);\n" | |
509 | " document.myForm.showOption.options[document.myForm.showOption.length]=elem;\n" | |
510 | " }\n" | |
511 | " if (adatok[index*egyelem+3]!=\"\")\n" | |
512 | " {\n" | |
513 | " elem = new Option(\"TTCN-3 code\", adatok[index*egyelem+3], false, kijelolt[1]);\n" | |
514 | " document.myForm.showOption.options[document.myForm.showOption.length]=elem;\n" | |
515 | " }\n" | |
516 | " if (adatok[index*egyelem+4]!=\"\")\n" | |
517 | " {\n" | |
518 | " elem = new Option(\"TTCN-3 executor's log\", adatok[index*egyelem+4], false, kijelolt[2]);\n" | |
519 | " document.myForm.showOption.options[document.myForm.showOption.length]=elem;\n" | |
520 | " }\n" | |
521 | " if (adatok[index*egyelem+5]!=\"\")\n" | |
522 | " {\n" | |
523 | " elem = new Option(\"Other type of log\", adatok[index*egyelem+5], false, kijelolt[3]);\n" | |
524 | " document.myForm.showOption.options[document.myForm.showOption.length]=elem;\n" | |
525 | " }\n" | |
526 | " }\n" | |
527 | " }\n" | |
528 | "\n" | |
529 | " function goNext()\n" | |
530 | " {\n" | |
531 | " if (document.myForm.testchoose.selectedIndex<document.myForm.testchoose.length-1)\n" | |
532 | " {\n" | |
533 | " itemsSelected();\n" | |
534 | " document.myForm.testchoose.selectedIndex++;\n" | |
535 | " tcChange();\n" | |
536 | " }\n" | |
537 | " }\n" | |
538 | "\n" | |
539 | " function goPrev()\n" | |
540 | " {\n" | |
541 | " if (document.myForm.testchoose.selectedIndex>0)\n" | |
542 | " {\n" | |
543 | " itemsSelected();\n" | |
544 | " document.myForm.testchoose.selectedIndex--;\n" | |
545 | " tcChange();\n" | |
546 | " }\n" | |
547 | " }\n" | |
548 | "\n" | |
549 | " function itemsSelected()\n" | |
550 | " {\n" | |
551 | " if (document.myForm.showOption.length)\n" | |
552 | " {\n" | |
553 | " for (b=0;b<4;b++)\n" | |
554 | " for (i=0;i<document.myForm.showOption.length;i++)\n" | |
555 | " if (document.myForm.showOption.options[i].value==adatok[index*egyelem+b+2])\n" | |
556 | " {\n" | |
557 | " if (!document.myForm.showOption.options[i].selected)\n" | |
558 | " kijelolt[b]=0;\n" | |
559 | " else\n" | |
560 | " kijelolt[b]=1;\n" | |
561 | " }\n" | |
562 | " }\n" | |
563 | " }\n" | |
564 | "\n" | |
565 | "\n" | |
566 | " function windShow()\n" | |
567 | " {\n" | |
568 | " index=document.myForm.testchoose.selectedIndex;\n" | |
569 | " selectnumb=0;\n" | |
570 | " for (i=0; i<document.myForm.showOption.length; i++)\n" | |
571 | " if (document.myForm.showOption.options[i].selected) selectnumb++;\n" | |
572 | " if (selectnumb>0)\n" | |
573 | " {\n" | |
574 | " mywin=window.open(\"\",index,\"toolbar,width=180,resizable=yes,scrollbars=no\");\n" | |
575 | " mywin.document.write(\"<html> <HEAD> <TITLE> Test Case: \"+document.myForm.testchoose.options[index].text+\"</TITLE> </HEAD> <frameset rows=\\\"\");\n" | |
576 | " csillag=\"1\";\n" | |
577 | " for (i=0; i<selectnumb; i++)\n" | |
578 | " csillag=\"*,\"+csillag;\n" | |
579 | " mywin.document.write(csillag+\"\\\">\");\n" | |
580 | " for (i=0; i<document.myForm.showOption.length; i++)\n" | |
581 | " if (document.myForm.showOption.options[i].selected)\n" | |
582 | " mywin.document.write(\"<frame src=\\\"\"+document.myForm.showOption.options[i].value+\"\\\">\");\n" | |
583 | " mywin.document.write(\"</frameset></html>\");\n" | |
584 | " mywin.document.close();\n" | |
585 | " }\n" | |
586 | " }\n" | |
587 | "\n" | |
588 | " function summaryShow()\n" | |
589 | " {\n" | |
590 | " mywin=window.open(\"\",index,\"toolbar,resizable=yes,scrollbars=yes\");\n" | |
591 | " mywin.document.writeln(\"<html> <HEAD> <TITLE> Summary </TITLE> </HEAD><body>\");\n" | |
592 | " mywin.document.writeln(\"<br>\");\n" | |
593 | " mywin.document.write(\"<P align=\\\"center\\\"><font size=\\\"10\\\">\");\n" | |
594 | " mywin.document.write(mtitle);\n" | |
595 | " mywin.document.writeln(\"</P>\");\n" | |
596 | " mywin.document.write(\"<font size=\\\"5\\\">\");\n" | |
597 | " mywin.document.writeln(\"\");\n" | |
598 | "mywin.document.writeln(\"<hr>\");\n" | |
599 | "mywin.document.writeln(\"<br>\");\n" | |
600 | " mywin.document.write(\"<table border=\\\"2\\\" cellpading=\\\"5\\\" cellspacing=\\\"2\\\"><tr><th scope=\\\"col\\\">  Test Case  </th><th scope=\\\"col\\\">  Short Description  </th><th scope=\\\"col\\\">  Verdict  </th>\");\n", wfile); | |
601 | ||
602 | tclist = first; | |
603 | while ( tclist->next != NULL ) | |
604 | { | |
605 | sprintf ( buf, "mywin.document.writeln(\"<tr><td>  %s  </td><td>", tclist->tcname ); | |
606 | fputs ( buf, wfile ); | |
607 | ||
608 | sprintf ( filename, "%s/%s.short", data_dstdir, tclist->tcname ); | |
609 | ||
610 | if ( ( rfile = fopen ( filename, "rt" ) ) == NULL ) fputs ( "No description found!", wfile ); | |
611 | else | |
612 | { | |
613 | int c; | |
614 | ||
615 | while ( ( c = getc ( rfile ) ) != EOF ) | |
616 | { | |
617 | if ( c == '\n' ) putc ( ' ', wfile ); | |
618 | else if ( c == '"' ) | |
619 | { | |
620 | putc ( '\\', wfile ); | |
621 | putc ( c, wfile ); | |
622 | } | |
623 | else putc ( c, wfile ); | |
624 | } | |
625 | fclose ( rfile ); | |
626 | } | |
627 | fputs ( "</td><td ALIGN=\\\"CENTER\\\">  ", wfile ); | |
628 | ||
629 | sprintf ( filename, "%s/%s.ttcnlog", data_dstdir, tclist->tcname ); | |
630 | if ( ( rfile = fopen ( filename, "rt" ) ) == NULL ) fputs ( "none", wfile ); | |
631 | else | |
632 | { | |
633 | while ( fgets ( buf, sizeof ( buf ), rfile ) != NULL ) | |
634 | { | |
635 | ctemp = strchr ( buf, 'V' ); | |
636 | while ( ctemp != NULL ) | |
637 | { | |
638 | if ( strncmp ( ctemp, "Verdict: ", 9 ) == 0 ) | |
639 | { | |
640 | if ( ctemp[strlen(ctemp)-1] == '\n' ) ctemp[strlen(ctemp)-1] = '\0'; | |
641 | fputs ( ctemp + 9, wfile ); | |
642 | ctemp = NULL; | |
643 | } | |
644 | else ctemp = strchr ( ctemp+1, 'V' ); | |
645 | } | |
646 | } | |
647 | fclose ( rfile ); | |
648 | } | |
649 | ||
650 | fputs ( "  </td></tr>\");\n", wfile ); | |
651 | ||
652 | tclist = tclist->next; | |
653 | } | |
654 | ||
655 | tval = time ( NULL ); | |
656 | ctemp = ctime ( &tval ); | |
657 | if ( ctemp[strlen(ctemp)-1] == '\n' ) ctemp[strlen(ctemp)-1] = '\0'; | |
658 | ||
659 | fprintf(wfile, " mywin.document.write(\"</tr></table>\");\n" | |
660 | " mywin.document.writeln(\"<br>\");\n" | |
661 | " mywin.document.write(\"<font size=\\\"3\\\">\");\n" | |
662 | " mywin.document.write(\"Date : \")\n" | |
663 | " mywin.document.writeln(\"%s\");\n" | |
664 | " mywin.document.write(\"</body></html>\");\n" | |
665 | " mywin.document.close();\n" | |
666 | " }\n" | |
667 | "\n" | |
668 | " document.write(\"<P align=\\\"center\\\"><font size=\\\"10\\\">\");\n" | |
669 | " document.write(mtitle);\n" | |
670 | " document.write(\"<font size=\\\"5\\\">\");\n" | |
671 | "\n" | |
672 | " </script>\n" | |
673 | " <form name=\"myForm\">\n" | |
674 | " <hr><br><SELECT size=\"12\" NAME=\"testchoose\" onChange=\"itemsSelected();tcChange()\">\n" | |
675 | " <OPTION> Blank testcase Name ....................\n" | |
676 | " </SELECT>\n" | |
677 | " <SELECT multiple size=\"12\" NAME=\"showOption\" >\n" | |
678 | " <OPTION SELECTED> Blank options Name ........................................\n" | |
679 | " </SELECT>\n" | |
680 | " <p>\n" | |
681 | " <input type=\"button\" name=\"PrevButt\" value=\"Previous\" onClick=\"goPrev()\">\n" | |
682 | " <input type=\"button\" name=\"nextButt\" value=\"Next\" onClick=\"goNext()\">\n" | |
683 | " <input type=\"button\" name=\"newWind\" value=\"Show\" onClick=\"windShow()\">\n" | |
684 | " <input type=\"button\" name=\"summary\" value=\"Summary\" onClick=\"summaryShow()\">\n" | |
685 | " </p>\n" | |
686 | " </form>\n" | |
687 | " <script type=\"text/javascript\">\n" | |
688 | " for (i=0; i<tcszam; i++)\n" | |
689 | " {\n" | |
690 | " elem = new Option(adatok[i*egyelem], \"\", false, false);\n" | |
691 | " document.myForm.testchoose.options[i]=elem;\n" | |
692 | " }\n" | |
693 | " document.myForm.testchoose.selectedIndex=0;\n" | |
694 | " tcChange();\n" | |
695 | " document.writeln(tcszam);" | |
696 | " </script>\n" | |
697 | " Testcases altogether <p></p>\n" | |
698 | " <font size=-1>Date: %s <p></p>\n" | |
699 | " </body>\n" | |
700 | "</html>\n", ctemp, ctemp); | |
701 | ||
702 | fclose ( wfile ); | |
703 | ||
704 | sprintf ( filename, "%s/logo.gif", data_dstdir ); | |
705 | if ( ( wfile = fopen ( filename, "wt" ) ) == NULL ) | |
706 | { | |
707 | perror ( filename ); | |
708 | return -1; | |
709 | } | |
710 | ||
711 | fwrite ( &logo, sizeof ( logo ), 1, wfile ); | |
712 | ||
713 | fclose ( wfile ); | |
714 | ||
715 | return 0; | |
716 | } |