Changeset 281
- Timestamp:
- 12/27/14 01:01:43 (10 years ago)
- Location:
- cpp
- Files:
-
- 7 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) -
cpp/frams/virtfile/stdiofile.cpp
r227 r281 7 7 #include <common/nonstd_stdio.h> 8 8 #include <common/framsg.h> 9 #include <common/Convert.h> 9 10 10 VirtFILE* StdioFileSystem::Vfopen(const char * path,const char*mode)11 VirtFILE* StdioFileSystem::Vfopen(const char *path, const char *mode) 11 12 { 12 13 //printFM("Vfopen %s %s",path,mode); 13 14 #ifdef USE_MFILE 14 MFILE *f =mfopen(path,mode);15 MFILE *f = mfopen(path, mode); 15 16 #else 16 FILE *f=fopen(path,mode); 17 #ifdef _WIN32 18 FILE *f = _wfopen(Convert::utf8ToUtf16(path).c_str(), Convert::strTOwstr(mode).c_str()); 19 #else 20 FILE *f = fopen(path, mode); 21 #endif 17 22 #endif 18 23 //printFM("%p",f); 19 if (f) return new StdioFILE(f, path); else return 0;24 if (f) return new StdioFILE(f, path); else return 0; 20 25 } 21 26 … … 23 28 { 24 29 //printFM("Vopendir %s",path); 25 DIR *d=opendir(path); 30 #ifdef _WIN32 31 DIRTYPE *d = wopendir(Convert::utf8ToUtf16(path).c_str()); 32 #else 33 DIR *d = opendir(path); 34 #endif 26 35 //printFM("%p",d); 27 36 if (d) return new StdioDIR(d); else return 0; … … 48 57 { 49 58 //printFM("Vreaddir %s",dir); 59 #ifdef _WIN32 60 wdirent *wde=wreaddir(dir); 61 if (wde==NULL) return NULL; 62 strcpy(de.d_name, Convert::wstrToUtf8(wde->d_name).c_str()); 63 return &de; 64 #else 50 65 return readdir(dir); 66 #endif 51 67 } -
cpp/frams/virtfile/stdiofile.h
r247 r281 15 15 #include <common/nonstd_dir.h> 16 16 17 class StdioFileSystem : public VirtFileSystem17 class StdioFileSystem : public VirtFileSystem 18 18 { 19 19 public: 20 VirtFILE *Vfopen(const char* path,const char*mode);21 int Vfexists(const char* path);22 VirtDIR *Vopendir(const char* path);20 VirtFILE *Vfopen(const char *path, const char *mode); 21 int Vfexists(const char* path); 22 VirtDIR *Vopendir(const char* path); 23 23 }; 24 24 25 25 #ifdef USE_MFILE 26 class StdioFILE : public VirtFILE26 class StdioFILE : public VirtFILE 27 27 { 28 29 MFILE *file;30 SString path;31 32 StdioFILE(MFILE *f) {file=f;}33 StdioFILE(MFILE *f,const SString& p) {file=f;path=p;}34 static void setStdio();35 size_t Vread(void *ptr, size_t size, size_t nmemb) {return mfread(ptr,size,nmemb,file);}36 size_t Vwrite(const void *ptr, size_t size, size_t nmemb) {return mfwrite(ptr,size,nmemb,file);}37 int Veof() {return mfeof(file);}38 int Vputs(const char *s) {return mfputs(s,file);}39 char *Vgets(char *s, int size) {return mfgets(s,size,file);}40 int Vseek(long offset, int whence) {return mfseek(file,offset,whence);}41 long Vtell() {return mftell(file);}42 int Vflush() {return 0;/*NOT IMPLEMENTED!*/;}43 const char* VgetPath() {return path;}28 protected: 29 MFILE *file; 30 SString path; 31 public: 32 StdioFILE(MFILE *f) { file = f; } 33 StdioFILE(MFILE *f, const SString& p) { file = f; path = p; } 34 static void setStdio(); 35 size_t Vread(void *ptr, size_t size, size_t nmemb) { return mfread(ptr, size, nmemb, file); } 36 size_t Vwrite(const void *ptr, size_t size, size_t nmemb) { return mfwrite(ptr, size, nmemb, file); } 37 int Veof() { return mfeof(file); } 38 int Vputs(const char *s) { return mfputs(s, file); } 39 char *Vgets(char *s, int size) { return mfgets(s, size, file); } 40 int Vseek(long offset, int whence) { return mfseek(file, offset, whence); } 41 long Vtell() { return mftell(file); } 42 int Vflush() { return 0; /*NOT IMPLEMENTED!*/ } 43 const char* VgetPath() { return path; } 44 44 45 ~StdioFILE() {if (file) mfclose(file);}45 ~StdioFILE() { if (file) mfclose(file); } 46 46 }; 47 47 #else 48 class StdioFILE : public VirtFILE48 class StdioFILE : public VirtFILE 49 49 { 50 51 FILE *file;52 SString path;53 54 StdioFILE(FILE *f) {file=f;}55 StdioFILE(FILE *f,const SString& p) {file=f;path=p;}56 static void setStdio();57 size_t Vread(void *ptr, size_t size, size_t nmemb) {return fread(ptr,size,nmemb,file);}58 size_t Vwrite(const void *ptr, size_t size, size_t nmemb) {return fwrite(ptr,size,nmemb,file);}59 int Veof() {return feof(file);}60 int Vputc(int c) {return fputc(c,file);}61 int Vputs(const char *s) {return fputs(s,file);}62 int Vgetc() {return fgetc(file);}63 char *Vgets(char *s, int size) {return fgets(s,size,file);}64 int Vprintf(const char *format, va_list args) { return vfprintf(file,format,args); }65 int Vseek(long offset, int whence) {return fseek(file,offset,whence);}66 long Vtell() {return ftell(file);}67 void Vrewind() {rewind(file);}68 int Vflush() {return fflush(file);}69 const char* VgetPath() {return path;}50 protected: 51 FILE *file; 52 SString path; 53 public: 54 StdioFILE(FILE *f) { file = f; } 55 StdioFILE(FILE *f, const SString& p) { file = f; path = p; } 56 static void setStdio(); 57 size_t Vread(void *ptr, size_t size, size_t nmemb) { return fread(ptr, size, nmemb, file); } 58 size_t Vwrite(const void *ptr, size_t size, size_t nmemb) { return fwrite(ptr, size, nmemb, file); } 59 int Veof() { return feof(file); } 60 int Vputc(int c) { return fputc(c, file); } 61 int Vputs(const char *s) { return fputs(s, file); } 62 int Vgetc() { return fgetc(file); } 63 char *Vgets(char *s, int size) { return fgets(s, size, file); } 64 int Vprintf(const char *format, va_list args) { return vfprintf(file, format, args); } 65 int Vseek(long offset, int whence) { return fseek(file, offset, whence); } 66 long Vtell() { return ftell(file); } 67 void Vrewind() { rewind(file); } 68 int Vflush() { return fflush(file); } 69 const char* VgetPath() { return path; } 70 70 71 ~StdioFILE() {if (file) fclose(file);}71 ~StdioFILE() { if (file) fclose(file); } 72 72 }; 73 73 #endif 74 74 75 class StdioDIR: public VirtDIR 75 76 #ifdef _WIN32 77 #ifdef __BORLANDC__ 78 typedef wDIR DIRTYPE; 79 #else 80 typedef WDIR DIRTYPE; 81 #endif 82 #else 83 typedef DIR DIRTYPE; 84 #endif 85 86 class StdioDIR : public VirtDIR 76 87 { 77 DIR *dir; 78 public: 79 StdioDIR(DIR* d):dir(d) {} 80 ~StdioDIR() {if (dir) closedir(dir);} 81 dirent* Vreaddir(); 88 DIRTYPE *dir; 89 #ifdef _WIN32 90 dirent de; //only used to convert wide string names (wdirent) to utf8 (dirent) 91 #endif 92 public: 93 StdioDIR(DIRTYPE *d) : dir(d) {} 94 ~StdioDIR() 95 { 96 #ifdef _WIN32 97 if (dir) wclosedir(dir); 98 #else 99 if (dir) closedir(dir); 100 #endif 101 } 102 dirent* Vreaddir(); 82 103 }; 83 104 84 class StdioFILEDontClose : public StdioFILE105 class StdioFILEDontClose : public StdioFILE 85 106 { 86 107 public: 87 108 #ifdef USE_MFILE 88 StdioFILEDontClose(MFILE *f):StdioFILE(f) {}109 StdioFILEDontClose(MFILE *f) : StdioFILE(f) {} 89 110 #else 90 StdioFILEDontClose(FILE *f):StdioFILE(f) {}111 StdioFILEDontClose(FILE *f) : StdioFILE(f) {} 91 112 #endif 92 ~StdioFILEDontClose() {file=0;}113 ~StdioFILEDontClose() { file = 0; } 93 114 }; 94 115 95 116 #endif 117
Note: See TracChangeset
for help on using the changeset viewer.