124 lines
3 KiB
C
124 lines
3 KiB
C
|
/* c-arcmt-test.c */
|
||
|
|
||
|
#include "clang-c/Index.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#if defined(_WIN32)
|
||
|
#include <io.h>
|
||
|
#include <fcntl.h>
|
||
|
#endif
|
||
|
|
||
|
static int print_remappings(const char *path) {
|
||
|
CXRemapping remap;
|
||
|
unsigned i, N;
|
||
|
CXString origFname;
|
||
|
CXString transFname;
|
||
|
|
||
|
remap = clang_getRemappings(path);
|
||
|
if (!remap)
|
||
|
return 1;
|
||
|
|
||
|
N = clang_remap_getNumFiles(remap);
|
||
|
for (i = 0; i != N; ++i) {
|
||
|
clang_remap_getFilenames(remap, i, &origFname, &transFname);
|
||
|
|
||
|
fprintf(stdout, "%s\n", clang_getCString(origFname));
|
||
|
fprintf(stdout, "%s\n", clang_getCString(transFname));
|
||
|
|
||
|
clang_disposeString(origFname);
|
||
|
clang_disposeString(transFname);
|
||
|
}
|
||
|
|
||
|
clang_remap_dispose(remap);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int print_remappings_filelist(const char **files, unsigned numFiles) {
|
||
|
CXRemapping remap;
|
||
|
unsigned i, N;
|
||
|
CXString origFname;
|
||
|
CXString transFname;
|
||
|
|
||
|
remap = clang_getRemappingsFromFileList(files, numFiles);
|
||
|
if (!remap)
|
||
|
return 1;
|
||
|
|
||
|
N = clang_remap_getNumFiles(remap);
|
||
|
for (i = 0; i != N; ++i) {
|
||
|
clang_remap_getFilenames(remap, i, &origFname, &transFname);
|
||
|
|
||
|
fprintf(stdout, "%s\n", clang_getCString(origFname));
|
||
|
fprintf(stdout, "%s\n", clang_getCString(transFname));
|
||
|
|
||
|
clang_disposeString(origFname);
|
||
|
clang_disposeString(transFname);
|
||
|
}
|
||
|
|
||
|
clang_remap_dispose(remap);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************/
|
||
|
/* Command line processing. */
|
||
|
/******************************************************************************/
|
||
|
|
||
|
static void print_usage(void) {
|
||
|
fprintf(stderr,
|
||
|
"usage: c-arcmt-test -mt-migrate-directory <path>\n"
|
||
|
" c-arcmt-test <remap-file-path1> <remap-file-path2> ...\n\n\n");
|
||
|
}
|
||
|
|
||
|
/***/
|
||
|
|
||
|
int carcmttest_main(int argc, const char **argv) {
|
||
|
clang_enableStackTraces();
|
||
|
if (argc == 3 && strncmp(argv[1], "-mt-migrate-directory", 21) == 0)
|
||
|
return print_remappings(argv[2]);
|
||
|
|
||
|
if (argc > 1)
|
||
|
return print_remappings_filelist(argv+1, argc-1);
|
||
|
|
||
|
print_usage();
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/***/
|
||
|
|
||
|
/* We intentionally run in a separate thread to ensure we at least minimal
|
||
|
* testing of a multithreaded environment (for example, having a reduced stack
|
||
|
* size). */
|
||
|
|
||
|
typedef struct thread_info {
|
||
|
int argc;
|
||
|
const char **argv;
|
||
|
int result;
|
||
|
} thread_info;
|
||
|
void thread_runner(void *client_data_v) {
|
||
|
thread_info *client_data = client_data_v;
|
||
|
client_data->result = carcmttest_main(client_data->argc, client_data->argv);
|
||
|
#ifdef __CYGWIN__
|
||
|
fflush(stdout); /* stdout is not flushed on Cygwin. */
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
int main(int argc, const char **argv) {
|
||
|
thread_info client_data;
|
||
|
|
||
|
#if defined(_WIN32)
|
||
|
if (getenv("LIBCLANG_LOGGING") == NULL)
|
||
|
putenv("LIBCLANG_LOGGING=1");
|
||
|
_setmode( _fileno(stdout), _O_BINARY );
|
||
|
#else
|
||
|
setenv("LIBCLANG_LOGGING", "1", /*overwrite=*/0);
|
||
|
#endif
|
||
|
|
||
|
if (getenv("CINDEXTEST_NOTHREADS"))
|
||
|
return carcmttest_main(argc, argv);
|
||
|
|
||
|
client_data.argc = argc;
|
||
|
client_data.argv = argv;
|
||
|
clang_executeOnThread(thread_runner, &client_data, 0);
|
||
|
return client_data.result;
|
||
|
}
|