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