/[jscoverage]/trunk/instrument.c
ViewVC logotype

Diff of /trunk/instrument.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2 by siliconforks, Wed Aug 1 13:51:53 2007 UTC revision 95 by siliconforks, Wed May 7 22:50:00 2008 UTC
# Line 1  Line 1 
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
# Line 54  Line 54 
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='%ssh_nedit.css'>\n", relative_path_to_ancestor);  
   fprintf(output, "<script src=\"%sjscoverage.js\"></script>\n", relative_path_to_ancestor);  
   fprintf(output, "<script src=\"%ssh_main.min.js\"></script>\n", relative_path_to_ancestor);  
   fprintf(output, "<script src=\"%ssh_javascript.min.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, "&lt;");  
     }  
     else if (c == '>') {  
       fprintf(output, "&gt;");  
     }  
     else if (c == '&') {  
       fprintf(output, "&amp;");  
     }  
     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");
# Line 162  Line 86 
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        }        }
# Line 225  Line 162 
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) {
# Line 270  Line 210 
210    copy_resource("jscoverage.css", destination_directory);    copy_resource("jscoverage.css", destination_directory);
211    copy_resource("jscoverage.js", destination_directory);    copy_resource("jscoverage.js", destination_directory);
212    copy_resource("jscoverage-throbber.gif", destination_directory);    copy_resource("jscoverage-throbber.gif", destination_directory);
213    copy_resource("sh_main.min.js", destination_directory);    copy_resource("jscoverage-sh_main.js", destination_directory);
214    copy_resource("sh_javascript.min.js", destination_directory);    copy_resource("jscoverage-sh_javascript.js", destination_directory);
215    copy_resource("sh_nedit.css", destination_directory);    copy_resource("jscoverage-sh_nedit.css", destination_directory);
216  }  }

Legend:
Removed from v.2  
changed lines
  Added in v.95

  ViewVC Help
Powered by ViewVC 1.1.24