1 /* c-arcmt-test.c */ 2 3 #include "clang-c/Index.h" 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <string.h> 7 #if defined(_WIN32) 8 #include <io.h> 9 #include <fcntl.h> 10 #endif 11 12 static int print_remappings(const char *path) { 13 CXRemapping remap; 14 unsigned i, N; 15 CXString origFname; 16 CXString transFname; 17 18 remap = clang_getRemappings(path); 19 if (!remap) 20 return 1; 21 22 N = clang_remap_getNumFiles(remap); 23 for (i = 0; i != N; ++i) { 24 clang_remap_getFilenames(remap, i, &origFname, &transFname); 25 26 fprintf(stdout, "%s\n", clang_getCString(origFname)); 27 fprintf(stdout, "%s\n", clang_getCString(transFname)); 28 29 clang_disposeString(origFname); 30 clang_disposeString(transFname); 31 } 32 33 clang_remap_dispose(remap); 34 return 0; 35 } 36 37 /******************************************************************************/ 38 /* Command line processing. */ 39 /******************************************************************************/ 40 41 static void print_usage(void) { 42 fprintf(stderr, 43 "usage: c-arcmt-test -arcmt-migrate-directory <path>\n\n\n"); 44 } 45 46 /***/ 47 48 int carcmttest_main(int argc, const char **argv) { 49 clang_enableStackTraces(); 50 if (argc == 3 && strncmp(argv[1], "-arcmt-migrate-directory", 24) == 0) 51 return print_remappings(argv[2]); 52 53 print_usage(); 54 return 1; 55 } 56 57 /***/ 58 59 /* We intentionally run in a separate thread to ensure we at least minimal 60 * testing of a multithreaded environment (for example, having a reduced stack 61 * size). */ 62 63 typedef struct thread_info { 64 int argc; 65 const char **argv; 66 int result; 67 } thread_info; 68 void thread_runner(void *client_data_v) { 69 thread_info *client_data = client_data_v; 70 client_data->result = carcmttest_main(client_data->argc, client_data->argv); 71 } 72 73 int main(int argc, const char **argv) { 74 thread_info client_data; 75 76 #if defined(_WIN32) 77 if (getenv("LIBCLANG_LOGGING") == NULL) 78 putenv("LIBCLANG_LOGGING=1"); 79 _setmode( _fileno(stdout), _O_BINARY ); 80 #else 81 setenv("LIBCLANG_LOGGING", "1", /*overwrite=*/0); 82 #endif 83 84 if (getenv("CINDEXTEST_NOTHREADS")) 85 return carcmttest_main(argc, argv); 86 87 client_data.argc = argc; 88 client_data.argv = argv; 89 clang_executeOnThread(thread_runner, &client_data, 0); 90 return client_data.result; 91 } 92