1 |
/* |
/* |
2 |
instrument.c - file and directory instrumentation routines |
instrument.c - file and directory instrumentation routines |
3 |
Copyright (C) 2007 siliconforks.com |
Copyright (C) 2007, 2008 siliconforks.com |
4 |
|
|
5 |
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
6 |
it under the terms of the GNU General Public License as published by |
it under the terms of the GNU General Public License as published by |
54 |
} |
} |
55 |
} |
} |
56 |
|
|
|
static void highlight_file(const char * source_file, const char * destination_file, const char * relative_path) { |
|
|
int depth = 0; |
|
|
for (const char * p = relative_path; *p != '\0'; p++) { |
|
|
if (*p == '/' || *p == '\\') { |
|
|
depth++; |
|
|
} |
|
|
} |
|
|
|
|
|
enum FileType file_type = get_file_type(relative_path); |
|
|
const char * suffix = ".jscoverage.html"; |
|
|
char * highlighted_file = xmalloc(strlen(destination_file) + strlen(suffix) + 1); |
|
|
strcpy(highlighted_file, destination_file); |
|
|
strcat(highlighted_file, suffix); |
|
|
|
|
|
FILE * input = xfopen(source_file, "r"); |
|
|
FILE * output = xfopen(highlighted_file, "w"); |
|
|
|
|
|
free(highlighted_file); |
|
|
|
|
|
char * relative_path_to_ancestor = xmalloc(depth * 3 + 1); |
|
|
for (int i = 0; i < depth; i++) { |
|
|
strcpy(relative_path_to_ancestor + i * 3, "../"); |
|
|
} |
|
|
relative_path_to_ancestor[depth * 3] = '\0'; |
|
|
|
|
|
fprintf(output, "<html><head><title>%s</title>\n", relative_path); |
|
|
fprintf(output, "<link rel=\"stylesheet\" type='text/css' href='%sjscoverage.css'>\n", relative_path_to_ancestor); |
|
|
fprintf(output, "<link rel=\"stylesheet\" type='text/css' href='%sjscoverage-sh_nedit.css'>\n", relative_path_to_ancestor); |
|
|
fprintf(output, "<script src=\"%sjscoverage.js\"></script>\n", relative_path_to_ancestor); |
|
|
fprintf(output, "<script src=\"%sjscoverage-sh_main.js\"></script>\n", relative_path_to_ancestor); |
|
|
fprintf(output, "<script src=\"%sjscoverage-sh_javascript.js\"></script>\n", relative_path_to_ancestor); |
|
|
fprintf(output, "<script>\n"); |
|
|
fprintf(output, "var gCurrentFile = \"%s\";\n", relative_path); |
|
|
fprintf(output, "</script>\n"); |
|
|
fprintf(output, "</head><body onload=\"source_load();\">\n"); |
|
|
fprintf(output, "<h1>%s</h1>\n", relative_path); |
|
|
fprintf(output, "<pre id=\"sourceDiv\" class='sh_%s'>", file_type == FILE_TYPE_JS? "javascript": "html"); |
|
|
free(relative_path_to_ancestor); |
|
|
|
|
|
int c; |
|
|
int atLineStart = 1; |
|
|
int line = 1; |
|
|
while ((c = fgetc(input)) != EOF) { |
|
|
if (atLineStart) { |
|
|
atLineStart = 0; |
|
|
} |
|
|
|
|
|
if (c == '<') { |
|
|
fprintf(output, "<"); |
|
|
} |
|
|
else if (c == '>') { |
|
|
fprintf(output, ">"); |
|
|
} |
|
|
else if (c == '&') { |
|
|
fprintf(output, "&"); |
|
|
} |
|
|
else { |
|
|
if (c == '\n') { |
|
|
line++; |
|
|
atLineStart = 1; |
|
|
} |
|
|
fputc(c, output); |
|
|
} |
|
|
} |
|
|
fprintf(output, "</pre></body></html>\n"); |
|
|
|
|
|
fclose(output); |
|
|
fclose(input); |
|
|
|
|
|
suffix = ".jscoverage.js"; |
|
|
char original_file[strlen(destination_file) + strlen(suffix) + 1]; |
|
|
strcpy(original_file, destination_file); |
|
|
strcat(original_file, suffix); |
|
|
copy_file(source_file, original_file); |
|
|
} |
|
|
|
|
57 |
static void check_same_file(const char * file1, const char * file2) { |
static void check_same_file(const char * file1, const char * file2) { |
58 |
if (is_same_file(file1, file2)) { |
if (is_same_file(file1, file2)) { |
59 |
fatal("source and destination are the same"); |
fatal("source and destination are the same"); |
86 |
copy_file(source_file, destination_file); |
copy_file(source_file, destination_file); |
87 |
break; |
break; |
88 |
case FILE_TYPE_JS: |
case FILE_TYPE_JS: |
|
highlight_file(source_file, destination_file, id); |
|
89 |
{ |
{ |
90 |
FILE * input = xfopen(source_file, "r"); |
FILE * input = xfopen(source_file, "r"); |
91 |
FILE * output = xfopen(destination_file, "w"); |
FILE * output = xfopen(destination_file, "w"); |
92 |
jscoverage_instrument_js(id, input, output); |
|
93 |
|
Stream * input_stream = Stream_new(0); |
94 |
|
Stream * output_stream = Stream_new(0); |
95 |
|
|
96 |
|
Stream_write_file_contents(input_stream, input); |
97 |
|
|
98 |
|
jscoverage_instrument_js(id, input_stream, output_stream); |
99 |
|
|
100 |
|
if (fwrite(output_stream->data, 1, output_stream->length, output) != output_stream->length) { |
101 |
|
fatal("cannot write to file: %s", destination_file); |
102 |
|
} |
103 |
|
|
104 |
|
Stream_delete(input_stream); |
105 |
|
Stream_delete(output_stream); |
106 |
|
|
107 |
fclose(input); |
fclose(input); |
108 |
fclose(output); |
fclose(output); |
109 |
} |
} |
162 |
fatal("cannot stat directory: %s", destination); |
fatal("cannot stat directory: %s", destination); |
163 |
} |
} |
164 |
|
|
165 |
|
/* copy the resources */ |
166 |
|
jscoverage_copy_resources(destination); |
167 |
|
|
168 |
/* finally: copy the directory */ |
/* finally: copy the directory */ |
169 |
struct DirListEntry * list = make_recursive_dir_list(source); |
struct DirListEntry * list = make_recursive_dir_list(source); |
170 |
for (struct DirListEntry * p = list; p != NULL; p = p->next) { |
for (struct DirListEntry * p = list; p != NULL; p = p->next) { |