• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
print_remappings(const char * path)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 
print_usage(void)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 
carcmttest_main(int argc,const char ** argv)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;
thread_runner(void * client_data_v)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 
main(int argc,const char ** argv)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