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