The Android Open Source Project | 46c012c | 2008-10-21 07:00:00 -0700 | [diff] [blame] | 1 | #include <unistd.h> |
| 2 | #include "search_path.h" |
| 3 | #include "options.h" |
The Android Open Source Project | bcaa86d | 2009-01-09 17:51:23 -0800 | [diff] [blame] | 4 | #include <string.h> |
The Android Open Source Project | 46c012c | 2008-10-21 07:00:00 -0700 | [diff] [blame] | 5 | |
| 6 | #ifdef HAVE_MS_C_RUNTIME |
| 7 | #include <io.h> |
| 8 | #endif |
| 9 | |
| 10 | static vector<string> g_importPaths; |
| 11 | |
| 12 | void |
| 13 | set_import_paths(const vector<string>& importPaths) |
| 14 | { |
| 15 | g_importPaths = importPaths; |
| 16 | } |
| 17 | |
| 18 | char* |
| 19 | find_import_file(const char* given) |
| 20 | { |
| 21 | string expected = given; |
| 22 | |
| 23 | int N = expected.length(); |
| 24 | for (int i=0; i<N; i++) { |
| 25 | char c = expected[i]; |
| 26 | if (c == '.') { |
| 27 | expected[i] = OS_PATH_SEPARATOR; |
| 28 | } |
| 29 | } |
| 30 | expected += ".aidl"; |
| 31 | |
| 32 | vector<string>& paths = g_importPaths; |
| 33 | for (vector<string>::iterator it=paths.begin(); it!=paths.end(); it++) { |
| 34 | string f = *it; |
| 35 | if (f.size() == 0) { |
| 36 | f = "."; |
| 37 | f += OS_PATH_SEPARATOR; |
| 38 | } |
| 39 | else if (f[f.size()-1] != OS_PATH_SEPARATOR) { |
| 40 | f += OS_PATH_SEPARATOR; |
| 41 | } |
| 42 | f.append(expected); |
| 43 | |
| 44 | #ifdef HAVE_MS_C_RUNTIME |
| 45 | /* check that the file exists and is not write-only */ |
| 46 | if (0 == _access(f.c_str(), 0) && /* mode 0=exist */ |
| 47 | 0 == _access(f.c_str(), 4) ) { /* mode 4=readable */ |
| 48 | #else |
| 49 | if (0 == access(f.c_str(), R_OK)) { |
| 50 | #endif |
| 51 | return strdup(f.c_str()); |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | return NULL; |
| 56 | } |
| 57 | |