nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "logger.h" nuclear@0: #include "datapath.h" nuclear@0: nuclear@0: static std::set paths; nuclear@0: nuclear@0: void add_data_path(const char *path) nuclear@0: { nuclear@0: paths.insert(path); nuclear@0: } nuclear@0: nuclear@0: #ifndef TARGET_IPHONE nuclear@0: std::string datafile_path(const char *fname) nuclear@0: { nuclear@0: std::string res; nuclear@0: if(!fname) { nuclear@0: return res; nuclear@0: } nuclear@0: nuclear@0: std::set::const_iterator it = paths.begin(); nuclear@0: while(it != paths.end()) { nuclear@0: const std::string &path = *it++; nuclear@0: res = path + "/" + std::string(fname); nuclear@0: FILE *fp = fopen(res.c_str(), "r"); nuclear@0: if(fp) { nuclear@0: fclose(fp); nuclear@0: return res; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: // It's not found. Return the name itself just in case it's right here nuclear@0: return std::string(fname); nuclear@0: } nuclear@0: #else nuclear@0: #include nuclear@0: nuclear@0: std::string datafile_path(const char *fname) nuclear@0: { nuclear@0: std::string res; nuclear@0: if(!fname) { nuclear@0: return res; nuclear@0: } nuclear@0: nuclear@0: CFBundleRef bundle; nuclear@0: CFURLRef url; nuclear@0: CFStringRef cfname; nuclear@0: nuclear@0: cfname = CFStringCreateWithCString(0, fname, kCFStringEncodingASCII); nuclear@0: nuclear@0: bundle = CFBundleGetMainBundle(); nuclear@0: if(!(url = CFBundleCopyResourceURL(bundle, cfname, 0, 0))) { nuclear@0: CFRelease(cfname); nuclear@0: return fname; nuclear@0: } nuclear@0: CFRelease(cfname); nuclear@0: nuclear@0: char path[1024]; nuclear@0: if(!CFURLGetFileSystemRepresentation(url, 1, (unsigned char*)path, sizeof path)) { nuclear@0: CFRelease(url); nuclear@0: return fname; nuclear@0: } nuclear@0: CFRelease(url); nuclear@0: return std::string(path); nuclear@0: } nuclear@0: #endif