Home | History | Annotate | Download | only in c-arcmt-test
      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 
     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 
     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 
     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