////////////////////////////////////////////////////////////////////////////// //! Find the path for a file assuming that //! files are either in data/ or in ../../../src/<executable_name>/data/. //! //! @return the path if succeeded, otherwise 0 //! @param filename name of the file //! @param executable_path optional absolute path of the executable ////////////////////////////////////////////////////////////////////////////// char* findFilePath(const char* filename, const char* executable_path) { // search in data/ if (filename == 0) return 0; size_t filename_len = strlen(filename); const char data_folder[] = "../../data/"; size_t data_folder_len = strlen(data_folder); char* file_path = (char*) malloc( sizeof(char) * (data_folder_len + filename_len + 1)); strcpy(file_path, data_folder); strcat(file_path, filename); size_t file_path_len = strlen(file_path); file_path[file_path_len] = '\0'; std::fstream fh0(file_path, std::fstream::in); if (fh0.good()) return file_path; free( file_path); // search in ../../../src/<executable_name>/data/ if (executable_path == 0) return 0; size_t executable_path_len = strlen(executable_path); const char* exe; for (exe = executable_path + executable_path_len - 1; exe >= executable_path; --exe) if (*exe == '/' || *exe == '\\') break; if (exe < executable_path) exe = executable_path; else ++exe; size_t executable_len = strlen(exe); size_t executable_dir_len = executable_path_len - executable_len; const char projects_relative_path[] = "../../../src/"; size_t projects_relative_path_len = strlen(projects_relative_path); file_path = (char*) malloc( sizeof(char) * (executable_path_len + projects_relative_path_len + 1 + data_folder_len + filename_len + 1)); strncpy(file_path, executable_path, executable_dir_len); file_path[executable_dir_len] = '\0'; strcat(file_path, projects_relative_path); strcat(file_path, exe); file_path_len = strlen(file_path); if (*(file_path + file_path_len - 1) == 'e' && *(file_path + file_path_len - 2) == 'x' && *(file_path + file_path_len - 3) == 'e' && *(file_path + file_path_len - 4) == '.') { *(file_path + file_path_len - 4) = '/'; *(file_path + file_path_len - 3) = '\0'; } else { *(file_path + file_path_len - 0) = '/'; *(file_path + file_path_len + 1) = '\0'; } strcat(file_path, data_folder); strcat(file_path, filename); file_path_len = strlen(file_path); file_path[file_path_len] = '\0'; std::fstream fh1(file_path, std::fstream::in); if (fh1.good()) return file_path; free( file_path); return 0; }
static void test_get() { bpd::file_handle fh1(get_test_handle()); BOOST_REQUIRE_EQUAL(fh1.get(), get_test_handle()); }