Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 1 | /* c-arcmt-test.c */ |
| 2 | |
Argyrios Kyrtzidis | 97c337c | 2011-07-11 20:15:00 +0000 | [diff] [blame] | 3 | #include "clang-c/Index.h" |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 4 | #include <stdlib.h> |
| 5 | #include <stdio.h> |
| 6 | #include <string.h> |
Francois Pichet | 9de09d4 | 2011-07-10 19:48:34 +0000 | [diff] [blame] | 7 | #if defined(_WIN32) |
| 8 | #include <io.h> |
| 9 | #include <fcntl.h> |
| 10 | #endif |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 11 | |
| 12 | static int print_remappings(const char *path) { |
Argyrios Kyrtzidis | 97c337c | 2011-07-11 20:15:00 +0000 | [diff] [blame] | 13 | CXRemapping remap; |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 14 | unsigned i, N; |
| 15 | CXString origFname; |
| 16 | CXString transFname; |
| 17 | |
Argyrios Kyrtzidis | 97c337c | 2011-07-11 20:15:00 +0000 | [diff] [blame] | 18 | remap = clang_getRemappings(path); |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 19 | if (!remap) |
| 20 | return 1; |
| 21 | |
Argyrios Kyrtzidis | 97c337c | 2011-07-11 20:15:00 +0000 | [diff] [blame] | 22 | N = clang_remap_getNumFiles(remap); |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 23 | for (i = 0; i != N; ++i) { |
Argyrios Kyrtzidis | 97c337c | 2011-07-11 20:15:00 +0000 | [diff] [blame] | 24 | clang_remap_getFilenames(remap, i, &origFname, &transFname); |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 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 | |
Argyrios Kyrtzidis | 97c337c | 2011-07-11 20:15:00 +0000 | [diff] [blame] | 33 | clang_remap_dispose(remap); |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 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 | |
NAKAMURA Takumi | 0989bf7 | 2011-07-10 03:10:43 +0000 | [diff] [blame] | 76 | #if defined(_WIN32) |
| 77 | if (getenv("LIBCLANG_LOGGING") == NULL) |
| 78 | putenv("LIBCLANG_LOGGING=1"); |
Francois Pichet | 9de09d4 | 2011-07-10 19:48:34 +0000 | [diff] [blame] | 79 | _setmode( _fileno(stdout), _O_BINARY ); |
NAKAMURA Takumi | 0989bf7 | 2011-07-10 03:10:43 +0000 | [diff] [blame] | 80 | #else |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 81 | setenv("LIBCLANG_LOGGING", "1", /*overwrite=*/0); |
NAKAMURA Takumi | 0989bf7 | 2011-07-10 03:10:43 +0000 | [diff] [blame] | 82 | #endif |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 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 | } |