--- trunk/instrument.c 2007/08/11 17:41:23 7 +++ trunk/instrument.c 2008/06/01 14:35:47 124 @@ -1,6 +1,6 @@ /* instrument.c - file and directory instrumentation routines - Copyright (C) 2007 siliconforks.com + Copyright (C) 2007, 2008 siliconforks.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,6 +17,8 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include + #include "instrument.h" #include @@ -50,86 +52,10 @@ return FILE_TYPE_HTML; } else { - return FILE_TYPE_UNKNOWN; + return FILE_TYPE_OTHER; } } -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, "%s\n", relative_path); - fprintf(output, "\n", relative_path_to_ancestor); - fprintf(output, "\n", relative_path_to_ancestor); - fprintf(output, "\n", relative_path_to_ancestor); - fprintf(output, "\n", relative_path_to_ancestor); - fprintf(output, "\n", relative_path_to_ancestor); - fprintf(output, "\n"); - fprintf(output, "\n"); - fprintf(output, "

%s

\n", relative_path); - fprintf(output, "
", 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, "
\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); -} - static void check_same_file(const char * file1, const char * file2) { if (is_same_file(file1, file2)) { fatal("source and destination are the same"); @@ -157,16 +83,29 @@ if (instrumenting) { enum FileType file_type = get_file_type(source_file); switch (file_type) { - case FILE_TYPE_UNKNOWN: + case FILE_TYPE_OTHER: case FILE_TYPE_HTML: copy_file(source_file, destination_file); break; case FILE_TYPE_JS: - highlight_file(source_file, destination_file, id); { FILE * input = xfopen(source_file, "r"); FILE * output = xfopen(destination_file, "w"); - jscoverage_instrument_js(id, input, output); + + Stream * input_stream = Stream_new(0); + Stream * output_stream = Stream_new(0); + + Stream_write_file_contents(input_stream, input); + + jscoverage_instrument_js(id, input_stream, output_stream); + + if (fwrite(output_stream->data, 1, output_stream->length, output) != output_stream->length) { + fatal("cannot write to file: %s", destination_file); + } + + Stream_delete(input_stream); + Stream_delete(output_stream); + fclose(input); fclose(output); } @@ -225,6 +164,9 @@ fatal("cannot stat directory: %s", destination); } + /* copy the resources */ + jscoverage_copy_resources(destination); + /* finally: copy the directory */ struct DirListEntry * list = make_recursive_dir_list(source); for (struct DirListEntry * p = list; p != NULL; p = p->next) { @@ -264,13 +206,3 @@ } free_dir_list(list); } - -void jscoverage_copy_resources(const char * destination_directory) { - copy_resource("jscoverage.html", destination_directory); - copy_resource("jscoverage.css", destination_directory); - copy_resource("jscoverage.js", destination_directory); - copy_resource("jscoverage-throbber.gif", destination_directory); - copy_resource("sh_main.js", destination_directory); - copy_resource("sh_javascript.min.js", destination_directory); - copy_resource("sh_nedit.css", destination_directory); -}