Changeset 281 for cpp/common
- Timestamp:
- 12/27/14 01:01:43 (10 years ago)
- Location:
- cpp/common
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/common/Convert.cpp
r257 r281 128 128 return string(ret, 24); //24 znaki z pominieciem ostatniego \n 129 129 } 130 131 string Convert::wstrToUtf8(const wchar_t *str) 132 { 133 if (str == NULL) return ""; 134 string res; 135 wchar_t *wcp = (wchar_t*)str; 136 while (*wcp != 0) 137 { 138 int c = *wcp; 139 if (c < 0x80) res += c; 140 else if (c < 0x800) { res += 192 + c / 64; res += 128 + c % 64; } 141 else if (c - 0xd800u < 0x800) res += "<ERROR-CHAR>"; 142 else if (c < 0x10000) { res += 224 + c / 4096; res += 128 + c / 64 % 64; res += 128 + c % 64; } 143 else if (c < 0x110000) { res += 240 + c / 262144; res += 128 + c / 4096 % 64; res += 128 + c / 64 % 64; res += 128 + c % 64; } 144 else res += "<ERROR-CHAR>"; 145 wcp++; 146 } 147 return res; 148 } 149 150 #ifdef _WIN32 151 wstring Convert::utf8ToUtf16(const char *str) 152 { 153 wstring wstr; 154 int nOffset = 0; 155 int nDataLen = strlen(str) + 1; //including ending \0 156 int nLenWide = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(str + nOffset), 157 (int)(nDataLen - nOffset), NULL, 0); 158 wstr.resize(nLenWide); 159 if (MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(str + nOffset), 160 (int)(nDataLen - nOffset), 161 &wstr[0], nLenWide) != nLenWide) 162 { 163 //ASSERT(false); //some conversion error 164 return wstr; 165 } 166 return wstr; 167 } 168 #endif -
cpp/common/Convert.h
r247 r281 72 72 } 73 73 74 static string wstrTOutf8(const wchar_t *s) 75 { 76 if (s == NULL) return ""; 77 string res; 78 wchar_t *wcp = (wchar_t*)s; 79 while (*wcp != 0) 80 { 81 int c = *wcp; 82 if (c < 0x80) res += c; 83 else if (c < 0x800) { res += 192 + c / 64; res += 128 + c % 64; } 84 else if (c - 0xd800u < 0x800) res += "<ERR-CHAR>"; 85 else if (c < 0x10000) { res += 224 + c / 4096; res += 128 + c / 64 % 64; res += 128 + c % 64; } 86 else if (c < 0x110000) { res += 240 + c / 262144; res += 128 + c / 4096 % 64; res += 128 + c / 64 % 64; res += 128 + c % 64; } 87 else res += "<ERR-CHAR>"; 88 wcp++; 89 } 90 return res; 91 } 92 //#endif 74 static string wstrToUtf8(const wchar_t *str); 75 #ifdef _WIN32 76 static wstring utf8ToUtf16(const char *str); 77 #endif 93 78 }; 94 79 -
cpp/common/nonstd_stdio.cpp
r247 r281 5 5 #include "nonstd_stdio.h" 6 6 #include "nonstd.h" 7 #include "Convert.h" // strTOwstr()7 #include "Convert.h" //utf8ToUtf16() 8 8 #include <common/stl-util.h> 9 9 10 10 #if defined _WIN32 && !defined SHP 11 12 13 14 #else 15 11 //<unistd.h> not needed for unlink() 12 #include "Shlwapi.h" //PathIsRelative() 13 #include <sys/stat.h> //_stat 14 #else 15 #include <unistd.h> 16 16 #endif 17 17 18 18 bool fileExists(const char* path) 19 19 { 20 //lepiej gdyby uzywalo stat bo mfopen mogloby cos niepotrzebnie wczytywac przy otwarciu pliku ale mfopen wiadomo ze zadziala wszedzie tak samo 21 MFILE *f=mfopen(path,FOPEN_READ_BINARY); 22 if (f==NULL) return false; 23 mfclose(f); 24 return true; 20 //lepiej gdyby uzywalo stat bo mfopen mogloby cos niepotrzebnie wczytywac przy otwarciu pliku ale mfopen wiadomo ze zadziala wszedzie tak samo 21 #ifdef _WIN32 22 MFILE *f = mfopen(Convert::utf8ToUtf16(path).c_str(), Convert::strTOwstr(FOPEN_READ_BINARY).c_str()); 23 #else 24 MFILE *f = mfopen(path, FOPEN_READ_BINARY); 25 #endif 26 if (f == NULL) return false; 27 mfclose(f); 28 return true; 25 29 } 26 30 27 31 bool directoryExists(const char* path) 28 32 { 29 struct _stat s; 30 if (_stat(path,&s)!=0) return false; 31 return S_ISDIR(s.st_mode); 33 struct _stat s; 34 #ifdef _WIN32 35 if (_wstat(Convert::utf8ToUtf16(path).c_str(), &s) != 0) return false; 36 #else 37 if (_stat(path, &s) != 0) return false; 38 #endif 39 return S_ISDIR(s.st_mode); 32 40 } 33 41 … … 35 43 { 36 44 #ifdef _WIN32 37 return mkdir(path)==0;38 #else 39 return mkdir(path,0777)==0;45 return _wmkdir(Convert::utf8ToUtf16(path).c_str()) == 0; 46 #else 47 return mkdir(path,0777) == 0; 40 48 #endif 41 49 } … … 43 51 bool makeDirectories(const char* path) 44 52 { 45 if (directoryExists(path)) return true;46 string parentdir=getFileDir(path);47 if (!makeDirectories(parentdir.c_str())) return false;48 return makeDirectory(path);53 if (directoryExists(path)) return true; 54 string parentdir = getFileDir(path); 55 if (!makeDirectories(parentdir.c_str())) return false; 56 return makeDirectory(path); 49 57 } 50 58 51 59 int getFileSize(const char* path) 52 60 { 53 int size; 54 MFILE *f=mfopen(path,FOPEN_READ_BINARY); 55 if (f==NULL) return -1; 56 size=getFileSize(f); 57 mfclose(f); 58 return size; 61 int size; 62 #ifdef _WIN32 63 MFILE *f = mfopen(Convert::utf8ToUtf16(path).c_str(), Convert::strTOwstr(FOPEN_READ_BINARY).c_str()); 64 #else 65 MFILE *f = mfopen(path, FOPEN_READ_BINARY); 66 #endif 67 if (f == NULL) return -1; 68 size = getFileSize(f); 69 mfclose(f); 70 return size; 59 71 } 60 72 61 73 int getFileSize(MFILE *f) 62 74 { 63 64 65 66 67 75 int saved_pos = mftell(f); 76 mfseek(f, 0, SEEK_END); 77 int size = mftell(f); 78 mfseek(f, saved_pos, SEEK_SET); 79 return size; 68 80 } 69 81 70 82 bool removeFile(const char* path) 71 83 { 72 return _unlink(path)==0; //VS: "The POSIX name is deprecated. Instead, use the ISO C++ conformant name: _unlink" 84 #ifdef _WIN32 85 return _wunlink(Convert::utf8ToUtf16(path).c_str()) == 0; 86 #else 87 return _unlink(path) == 0; //VS: "The POSIX name is deprecated. Instead, use the ISO C++ conformant name: _unlink" 88 #endif 73 89 } 74 90 … … 76 92 { 77 93 if (fname == NULL) return false; //SplitFileSystem never passes NULL but this function is public so we never know 78 #if defined _WIN32 && !defined SHP 79 #ifdef __BORLANDC__ 80 return PathIsRelative(fname) == FALSE; //no wide char for old borland compiler 81 #else 82 return PathIsRelative(Convert::strTOwstr(fname).c_str()) == FALSE; //http://msdn.microsoft.com/en-us/library/bb773660%28v=vs.85%29.aspx 83 #endif 94 #if defined _WIN32 95 return PathIsRelativeW(Convert::utf8ToUtf16(fname).c_str()) == FALSE; //http://msdn.microsoft.com/en-us/library/bb773660%28v=vs.85%29.aspx 84 96 #else 85 97 return fname[0] == PATH_SEPARATOR_CHAR; -
cpp/common/nonstd_stdio.h
r247 r281 20 20 #include <dir.h> 21 21 #else 22 #ifndef MOBILE2D23 22 #include <direct.h> 24 #endif25 23 #define mkdir _mkdir 24 #define S_ISDIR(m) (((m)&S_IFDIR)==S_IFDIR) 26 25 #endif 27 26 28 #ifndef MOBILE2D 29 #include <io.h> //borland compiler: include <io.h> before <dir.h> causes the SimWorld class in "simul.h" be unrecognized, for unknown reason :O moreover, this problem is only pertinent to the CLI project, not GUI. Maybe this is caused by global defines like NOVCL, NO_STRICT etc.? 27 #include <io.h> //borland compiler: include <io.h> before <dir.h> causes the SimWorld class in "simul.h" be unrecognized, for unknown reason :O moreover, this problem is only pertinent to the CLI project, not GUI. Maybe this is caused by global defines like NOVCL, NO_STRICT etc.? 30 28 // #define makeDirectory(name) mkdir(name) 31 #endif32 33 #define S_ISDIR(x) ((x & _S_IFDIR)==_S_IFDIR)34 29 35 30 #else 36 31 37 38 32 #include <unistd.h> 33 #include <sys/stat.h> 39 34 // #define makeDirectory(name) mkdir(name,0777) 40 41 35 #define _unlink unlink //_unlink jest ISO-conformant, unlink jest POSIX-deprecated 36 #define _stat stat 42 37 #endif 43 38 … … 49 44 #ifdef __ANDROID__ 50 45 #include <nv_file/nv_file.h> 51 52 46 struct rwFILE //jedno z dwoch pol jest zainicjowane w zaleznosci od tego gdzie jest plik 47 { //nvidia uses a similar trick in nv_file.h (STD_FILE and APK_FILE), maybe doing a similar thing here is redundant? but their trick uses some trial-and-error code (see NvFOpen()) 53 48 NvFile *rfile; //can only read 54 49 FILE *rwfile; 55 50 rwFILE() {rfile=rwfile=NULL;} 56 57 51 }; 52 typedef rwFILE MFILE; 58 53 #else //SHP: 59 60 61 62 63 64 54 //z <stdio.h> wzielismy sprintfy i inne ktore dzia³aj¹... 55 #include <FIo.h> 56 // wklejone z sailora w ramach integracji frams+engine 57 // ale to nie sprawia ze framsy korzystaja z mfile - potrzebna jest implementacja virtfile dla bady! (patrz: stdiofile.h) 58 // i wtedy bedzie mozna mfile wywalic tez z sailora 59 typedef Osp::Io::File MFILE; 65 60 #endif 66 61 … … 82 77 83 78 #else 84 typedef FILE MFILE; 79 typedef FILE MFILE; 80 #ifdef _WIN32 81 #define mfopen _wfopen 82 #else 85 83 #define mfopen fopen 86 #define mfclose fclose 87 #define mfread fread 88 #define mfwrite fwrite 89 #define mfputs fputs 90 #define mfgets fgets 91 #define mfeof feof 92 #define mfseek fseek 93 #define mftell ftell 84 #endif 85 #define mfclose fclose 86 #define mfread fread 87 #define mfwrite fwrite 88 #define mfputs fputs 89 #define mfgets fgets 90 #define mfeof feof 91 #define mfseek fseek 92 #define mftell ftell 94 93 #endif 95 94 -
cpp/common/stl-util.cpp
r257 r281 7 7 #include <stdlib.h> 8 8 #include "nonstd_stdio.h" 9 #include "Convert.h" 9 10 #include "nonstd.h" 10 11 #include "framsg.h" … … 91 92 #endif 92 93 { 94 #ifdef _WIN32 95 MFILE *f = mfopen(Convert::utf8ToUtf16(filename).c_str(), Convert::strTOwstr(FOPEN_READ_BINARY).c_str()); 96 #else 93 97 MFILE *f = mfopen(filename, FOPEN_READ_BINARY); 98 #endif 94 99 if (f) 95 100 { … … 119 124 bool writeCompleteFile(const char* filename, const string& text, bool warn_on_fail) 120 125 { 126 #ifdef _WIN32 127 MFILE *f = mfopen(Convert::utf8ToUtf16(filename).c_str(), Convert::strTOwstr(FOPEN_WRITE_BINARY).c_str()); 128 #else 121 129 MFILE *f = mfopen(filename, FOPEN_WRITE_BINARY); 130 #endif 122 131 bool ok = f != NULL; 123 132 if (f)
Note: See TracChangeset
for help on using the changeset viewer.