1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <unistd.h>
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "search_path.h"
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "options.h"
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <string.h>
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifdef HAVE_MS_C_RUNTIME
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <io.h>
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic vector<string> g_importPaths;
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiset_import_paths(const vector<string>& importPaths)
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_importPaths = importPaths;
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskichar*
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifind_import_file(const char* given)
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    string expected = given;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int N = expected.length();
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<N; i++) {
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        char c = expected[i];
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (c == '.') {
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            expected[i] = OS_PATH_SEPARATOR;
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    expected += ".aidl";
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    vector<string>& paths = g_importPaths;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (vector<string>::iterator it=paths.begin(); it!=paths.end(); it++) {
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        string f = *it;
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (f.size() == 0) {
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            f = ".";
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            f += OS_PATH_SEPARATOR;
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else if (f[f.size()-1] != OS_PATH_SEPARATOR) {
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            f += OS_PATH_SEPARATOR;
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        f.append(expected);
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifdef HAVE_MS_C_RUNTIME
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /* check that the file exists and is not write-only */
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (0 == _access(f.c_str(), 0) &&  /* mode 0=exist */
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            0 == _access(f.c_str(), 4) ) { /* mode 4=readable */
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#else
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (0 == access(f.c_str(), R_OK)) {
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return strdup(f.c_str());
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NULL;
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
58