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 | |
Ted Kremenek | 30660a8 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 37 | static int print_remappings_filelist(const char **files, unsigned numFiles) { |
| 38 | CXRemapping remap; |
| 39 | unsigned i, N; |
| 40 | CXString origFname; |
| 41 | CXString transFname; |
| 42 | |
| 43 | remap = clang_getRemappingsFromFileList(files, numFiles); |
| 44 | if (!remap) |
| 45 | return 1; |
| 46 | |
| 47 | N = clang_remap_getNumFiles(remap); |
| 48 | for (i = 0; i != N; ++i) { |
| 49 | clang_remap_getFilenames(remap, i, &origFname, &transFname); |
| 50 | |
| 51 | fprintf(stdout, "%s\n", clang_getCString(origFname)); |
| 52 | fprintf(stdout, "%s\n", clang_getCString(transFname)); |
| 53 | |
| 54 | clang_disposeString(origFname); |
| 55 | clang_disposeString(transFname); |
| 56 | } |
| 57 | |
| 58 | clang_remap_dispose(remap); |
| 59 | return 0; |
| 60 | } |
| 61 | |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 62 | /******************************************************************************/ |
| 63 | /* Command line processing. */ |
| 64 | /******************************************************************************/ |
| 65 | |
| 66 | static void print_usage(void) { |
| 67 | fprintf(stderr, |
Ted Kremenek | 30660a8 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 68 | "usage: c-arcmt-test -mt-migrate-directory <path>\n" |
| 69 | " c-arcmt-test <remap-file-path1> <remap-file-path2> ...\n\n\n"); |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | /***/ |
| 73 | |
| 74 | int carcmttest_main(int argc, const char **argv) { |
| 75 | clang_enableStackTraces(); |
Ted Kremenek | 30660a8 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 76 | if (argc == 3 && strncmp(argv[1], "-mt-migrate-directory", 21) == 0) |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 77 | return print_remappings(argv[2]); |
| 78 | |
Ted Kremenek | 30660a8 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 79 | if (argc > 1) |
| 80 | return print_remappings_filelist(argv+1, argc-1); |
| 81 | |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 82 | print_usage(); |
| 83 | return 1; |
| 84 | } |
| 85 | |
| 86 | /***/ |
| 87 | |
| 88 | /* We intentionally run in a separate thread to ensure we at least minimal |
| 89 | * testing of a multithreaded environment (for example, having a reduced stack |
| 90 | * size). */ |
| 91 | |
| 92 | typedef struct thread_info { |
| 93 | int argc; |
| 94 | const char **argv; |
| 95 | int result; |
| 96 | } thread_info; |
| 97 | void thread_runner(void *client_data_v) { |
| 98 | thread_info *client_data = client_data_v; |
| 99 | client_data->result = carcmttest_main(client_data->argc, client_data->argv); |
NAKAMURA Takumi | 3be55cd | 2012-04-07 06:59:28 +0000 | [diff] [blame] | 100 | #ifdef __CYGWIN__ |
| 101 | fflush(stdout); /* stdout is not flushed on Cygwin. */ |
| 102 | #endif |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 103 | } |
| 104 | |
| 105 | int main(int argc, const char **argv) { |
| 106 | thread_info client_data; |
| 107 | |
NAKAMURA Takumi | 0989bf7 | 2011-07-10 03:10:43 +0000 | [diff] [blame] | 108 | #if defined(_WIN32) |
| 109 | if (getenv("LIBCLANG_LOGGING") == NULL) |
| 110 | putenv("LIBCLANG_LOGGING=1"); |
Francois Pichet | 9de09d4 | 2011-07-10 19:48:34 +0000 | [diff] [blame] | 111 | _setmode( _fileno(stdout), _O_BINARY ); |
NAKAMURA Takumi | 0989bf7 | 2011-07-10 03:10:43 +0000 | [diff] [blame] | 112 | #else |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 113 | setenv("LIBCLANG_LOGGING", "1", /*overwrite=*/0); |
NAKAMURA Takumi | 0989bf7 | 2011-07-10 03:10:43 +0000 | [diff] [blame] | 114 | #endif |
Argyrios Kyrtzidis | 69325d5 | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 115 | |
| 116 | if (getenv("CINDEXTEST_NOTHREADS")) |
| 117 | return carcmttest_main(argc, argv); |
| 118 | |
| 119 | client_data.argc = argc; |
| 120 | client_data.argv = argv; |
| 121 | clang_executeOnThread(thread_runner, &client_data, 0); |
| 122 | return client_data.result; |
| 123 | } |