#include <unistd.h>
#include "search_path.h"
#include "options.h"
#include "os.h"
#include <string.h>

#ifdef HAVE_MS_C_RUNTIME
#include <io.h>
#endif

static vector<string> g_importPaths;

void
set_import_paths(const vector<string>& importPaths)
{
    g_importPaths = importPaths;
}

char*
find_import_file(const char* given)
{
    string expected = given;

    int N = expected.length();
    for (int i=0; i<N; i++) {
        char c = expected[i];
        if (c == '.') {
            expected[i] = OS_PATH_SEPARATOR;
        }
    }
    expected += ".aidl";

    vector<string>& paths = g_importPaths;
    for (vector<string>::iterator it=paths.begin(); it!=paths.end(); it++) {
        string f = *it;
        if (f.size() == 0) {
            f = ".";
            f += OS_PATH_SEPARATOR;
        }
        else if (f[f.size()-1] != OS_PATH_SEPARATOR) {
            f += OS_PATH_SEPARATOR;
        }
        f.append(expected);

#ifdef HAVE_MS_C_RUNTIME
        /* check that the file exists and is not write-only */
        if (0 == _access(f.c_str(), 0) &&  /* mode 0=exist */
            0 == _access(f.c_str(), 4) ) { /* mode 4=readable */
#else
        if (0 == access(f.c_str(), R_OK)) {
#endif        
            return strdup(f.c_str());
        }
    }

    return NULL;
}

