#include "mutils.h" #include #include #include #include #define IS_64_BIT (UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFU) #define IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) namespace fs = std::filesystem; using namespace std; namespace MoonUtils { #if IS_BIG_ENDIAN const char* endian = "big"; #else const char* endian = "little"; #endif #if IS_64_BIT const char* bitwidth = "64"; #else const char* bitwidth = "32"; #endif const char* cwd = NULL; char *sys_strdup(const char *src) { const unsigned len = strlen(src) + 1; char *newstr = new char[len]; if (newstr) memcpy(newstr, src, len); return newstr; } char pathSeparator() { #ifdef _WIN32 return '\\'; #else return '/'; #endif } string normalize(string path){ #ifdef _WIN32 ranges::replace(path, '/', '\\'); #else replace(path.begin(), path.end(), '\\', '/'); #endif return path; } string join(string base, string file){ if( file == "/" ) return normalize(base + file); return normalize( (fs::path(base) / fs::path(file)).string() ); } string dirname(string path){ return normalize( fs::path(path).parent_path().string()); } string filename(string path){ return normalize( fs::path(path).filename().string() ); } string basename(string path){ return normalize( fs::path(path).stem().string() ); } vector split (const string &s, char delim) { vector result; stringstream ss (s); string item; while (getline(ss, item, delim)) { if (item.at(item.size() - 1) == '\r') item = item.substr(0, item.size() - 1); result.push_back (item); } return result; } std::string concat(std::vector list, std::string separator) { std::string output; for (auto& entry : list) output.append(entry + separator); return output; } bool exists(string path){ return fs::exists(path); } void mkdir(string path){ fs::create_directories(path); } void rm(string path){ if(!fs::exists(path)) return; if (fs::is_directory(path)) fs::remove_all(path); else fs::remove(path); } string absolute(string path) { return normalize(fs::absolute(path).string()); } string relative(string parent, string child){ return normalize(fs::relative(child, parent).string()); } void move(string src, string dst){ #ifdef _WIN32 // if (!MoveFileExA(const_cast(src.c_str()), const_cast(dst.c_str()), MOVEFILE_COPY_ALLOWED)) { // printf ("MoveFileEx failed with error %d\n", GetLastError()); // return; // } #else vector trashcan; for(auto& p: fs::recursive_directory_iterator(src)){ // Create path in target, if not existing. const auto relativeSrc = fs::relative(p, src); const auto targetParentPath = dst / relativeSrc.parent_path(); fs::create_directories(targetParentPath); // Copy to the targetParentPath which we just created. fs::copy(p, targetParentPath, fs::copy_options::overwrite_existing); string dname = p.path().parent_path().string(); trashcan.push_back(dname); } for(auto& p: trashcan) rm(p); #endif } void copy(string src, string dst){ if(!fs::exists(dirname(dst))) mkdir(dirname(dst)); fs::copy(src, dst, fs::copy_options::update_existing | fs::copy_options::recursive); } void write(std::string path, char* data, int size){ mkdir(dirname(path)); ofstream outfile(path, ios::out | ios::binary); outfile.write(data, size); outfile.flush(); outfile.close(); } void writeFile(string path, string content){ ofstream out(path); out << content; out.close(); } void dirscan(string path, vector &files){ if(!fs::is_directory(path)) return; for (auto& p : fs::directory_iterator(path)){ string fpath = p.path().string(); if(fs::is_directory(fpath)) { dirscan(fpath, files); } else { files.push_back(normalize(fpath)); } } } string extname(string file) { const char *filename = file.c_str(); const char *dot = strrchr(filename, '.'); if(!dot || dot == filename) return ""; return string(dot + 1); } std::wstring wide(const std::string& str) { return std::wstring_convert>().from_bytes(str); } std::string narrow(const std::wstring& str) { return std::wstring_convert>().to_bytes(str); } }