static void instrument_file(const char * source_file, const char * destination_file, const char * id, int instrumenting) { if (g_verbose) { printf("Instrumenting file %s\n", id); } /* check if they are the same */ char * canonical_source_file = make_canonical_path(source_file); char * canonical_destination_file = make_canonical_path(destination_file); check_same_file(canonical_source_file, canonical_destination_file); free(canonical_source_file); free(canonical_destination_file); if (instrumenting) { enum FileType file_type = get_file_type(source_file); switch (file_type) { case FILE_TYPE_OTHER: case FILE_TYPE_HTML: copy_file(source_file, destination_file); break; case FILE_TYPE_JS: { FILE * input = xfopen(source_file, "rb"); FILE * output = xfopen(destination_file, "wb"); Stream * input_stream = Stream_new(0); Stream * output_stream = Stream_new(0); Stream_write_file_contents(input_stream, input); size_t num_characters = input_stream->length; uint16_t * characters = NULL; int result = jscoverage_bytes_to_characters(jscoverage_encoding, input_stream->data, input_stream->length, &characters, &num_characters); if (result == JSCOVERAGE_ERROR_ENCODING_NOT_SUPPORTED) { fatal("encoding %s not supported", jscoverage_encoding); } else if (result == JSCOVERAGE_ERROR_INVALID_BYTE_SEQUENCE) { fatal("error decoding %s in file %s", jscoverage_encoding, id); } jscoverage_instrument_js(id, characters, num_characters, output_stream); free(characters); 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); } break; } } else { copy_file(source_file, destination_file); } }
static void instrument_file(const char * source_file, const char * destination_file, const char * id, int instrumenting) { /* check if they are the same */ char * canonical_source_file = make_canonical_path(source_file); char * canonical_destination_file = make_canonical_path(destination_file); check_same_file(canonical_source_file, canonical_destination_file); free(canonical_source_file); free(canonical_destination_file); if (instrumenting) { enum FileType file_type = get_file_type(source_file); switch (file_type) { case FILE_TYPE_OTHER: case FILE_TYPE_HTML: if (g_verbose) { printf("Copying file %s\n", id); } copy_file(source_file, destination_file); break; case FILE_TYPE_JS: { if (g_verbose) { printf("Instrumenting file %s\n", id); } FILE * input = xfopen(source_file, "rb"); FILE * output = xfopen(destination_file, "wb"); Stream * input_stream = Stream_new(0); Stream * output_stream = Stream_new(0); Stream_write_file_contents(input_stream, input); /* Check if the source file looks like an instrumented JavaScript file. */ if (input_stream->length >= JSCOVERAGE_INSTRUMENTED_HEADER_LENGTH && memcmp(input_stream->data, JSCOVERAGE_INSTRUMENTED_HEADER, JSCOVERAGE_INSTRUMENTED_HEADER_LENGTH) == 0) { fatal_command_line("file %s in the source directory appears to be already instrumented", id); } size_t num_characters = input_stream->length; uint16_t * characters = NULL; int result = jscoverage_bytes_to_characters(jscoverage_encoding, input_stream->data, input_stream->length, &characters, &num_characters); if (result == JSCOVERAGE_ERROR_ENCODING_NOT_SUPPORTED) { fatal("encoding %s not supported", jscoverage_encoding); } else if (result == JSCOVERAGE_ERROR_INVALID_BYTE_SEQUENCE) { fatal("error decoding %s in file %s", jscoverage_encoding, id); } jscoverage_instrument_js(id, characters, num_characters, output_stream); free(characters); 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); } break; } } else { if (g_verbose) { printf("Copying file %s (on --no-instrument list)\n", id); } copy_file(source_file, destination_file); } }