| | @@ -23,10 +23,18 @@ |
| 23 | 23 | #include "utf8.h" |
| 24 | 24 | #include <sqlite3.h> |
| 25 | 25 | #ifdef _WIN32 |
| 26 | 26 | # include <windows.h> |
| 27 | 27 | #endif |
| 28 | +#ifdef __CYGWIN__ |
| 29 | +# include <sys/cygwin.h> |
| 30 | +# define CP_UTF8 65001 |
| 31 | + __declspec(dllimport) extern __stdcall int WideCharToMultiByte(int, int, |
| 32 | + const char *, int, const char *, int, const char *, const char *); |
| 33 | + __declspec(dllimport) extern __stdcall int MultiByteToWideChar(int, int, |
| 34 | + const char *, int, wchar_t*, int); |
| 35 | +#endif |
| 28 | 36 | |
| 29 | 37 | #ifdef _WIN32 |
| 30 | 38 | /* |
| 31 | 39 | ** Translate MBCS to UTF-8. Return a pointer to the translated text. |
| 32 | 40 | ** Call fossil_mbcs_free() to deallocate any memory used to store the |
| | @@ -42,38 +50,39 @@ |
| 42 | 50 | ** any memory used to hold the translation |
| 43 | 51 | */ |
| 44 | 52 | void fossil_mbcs_free(char *zOld){ |
| 45 | 53 | sqlite3_free(zOld); |
| 46 | 54 | } |
| 55 | +#endif /* _WIN32 */ |
| 47 | 56 | |
| 48 | 57 | /* |
| 49 | 58 | ** Translate Unicode text into UTF-8. |
| 50 | 59 | ** Return a pointer to the translated text. |
| 51 | 60 | ** Call fossil_unicode_free() to deallocate any memory used to store the |
| 52 | 61 | ** returned pointer when done. |
| 53 | 62 | */ |
| 54 | 63 | char *fossil_unicode_to_utf8(const void *zUnicode){ |
| 55 | | -#ifdef _WIN32 |
| 64 | +#if defined(_WIN32) || defined(__CYGWIN__) |
| 56 | 65 | int nByte = WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, 0, 0, 0, 0); |
| 57 | 66 | char *zUtf = sqlite3_malloc( nByte ); |
| 58 | 67 | if( zUtf==0 ){ |
| 59 | 68 | return 0; |
| 60 | 69 | } |
| 61 | 70 | WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, zUtf, nByte, 0, 0); |
| 62 | 71 | return zUtf; |
| 63 | 72 | #else |
| 64 | | - return fossil_strdup(zUtf8); /* TODO: implement for unix */ |
| 73 | + return fossil_strdup(zUnicode); /* TODO: implement for unix */ |
| 65 | 74 | #endif |
| 66 | 75 | } |
| 67 | 76 | |
| 68 | 77 | /* |
| 69 | 78 | ** Translate UTF-8 to unicode for use in system calls. Return a pointer to the |
| 70 | 79 | ** translated text.. Call fossil_unicode_free() to deallocate any memory |
| 71 | 80 | ** used to store the returned pointer when done. |
| 72 | 81 | */ |
| 73 | 82 | void *fossil_utf8_to_unicode(const char *zUtf8){ |
| 74 | | -#ifdef _WIN32 |
| 83 | +#if defined(_WIN32) || defined(__CYGWIN__) |
| 75 | 84 | int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0); |
| 76 | 85 | wchar_t *zUnicode = sqlite3_malloc( nByte * 2 ); |
| 77 | 86 | if( zUnicode==0 ){ |
| 78 | 87 | return 0; |
| 79 | 88 | } |
| | @@ -87,17 +96,16 @@ |
| 87 | 96 | /* |
| 88 | 97 | ** Deallocate any memory that was previously allocated by |
| 89 | 98 | ** fossil_unicode_to_utf8(). |
| 90 | 99 | */ |
| 91 | 100 | void fossil_unicode_free(void *pOld){ |
| 92 | | -#ifdef _WIN32 |
| 101 | +#if defined(_WIN32) || defined(__CYGWIN__) |
| 93 | 102 | sqlite3_free(pOld); |
| 94 | 103 | #else |
| 95 | 104 | fossil_free(pOld); |
| 96 | 105 | #endif |
| 97 | 106 | } |
| 98 | | -#endif /* _WIN32 */ |
| 99 | 107 | |
| 100 | 108 | #if defined(__APPLE__) && !defined(WITHOUT_ICONV) |
| 101 | 109 | # include <iconv.h> |
| 102 | 110 | #endif |
| 103 | 111 | |
| | @@ -160,17 +168,17 @@ |
| 160 | 168 | ** Call fossil_filename_free() to deallocate any memory used to store the |
| 161 | 169 | ** returned pointer when done. |
| 162 | 170 | */ |
| 163 | 171 | void *fossil_utf8_to_filename(const char *zUtf8){ |
| 164 | 172 | #ifdef _WIN32 |
| 165 | | - int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0); |
| 166 | | - wchar_t *zUnicode = sqlite3_malloc( nByte * 2 ); |
| 173 | + int nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0); |
| 174 | + wchar_t *zUnicode = sqlite3_malloc( nChar * 2 ); |
| 167 | 175 | wchar_t *wUnicode = zUnicode; |
| 168 | 176 | if( zUnicode==0 ){ |
| 169 | 177 | return 0; |
| 170 | 178 | } |
| 171 | | - MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nByte); |
| 179 | + MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nChar); |
| 172 | 180 | while( *wUnicode != '\0' ){ |
| 173 | 181 | if( *wUnicode == '/' ){ |
| 174 | 182 | *wUnicode = '\\'; |
| 175 | 183 | } |
| 176 | 184 | ++wUnicode; |
| | @@ -178,22 +186,31 @@ |
| 178 | 186 | return zUnicode; |
| 179 | 187 | #elif defined(__CYGWIN__) |
| 180 | 188 | char *zPath, *p; |
| 181 | 189 | if( fossil_isalpha(zUtf8[0]) && (zUtf8[1]==':') |
| 182 | 190 | && (zUtf8[2]=='\\' || zUtf8[2]=='/')) { |
| 183 | | - int n = strlen(zUtf8); |
| 184 | | - zPath = fossil_malloc( n+10 ); |
| 185 | | - memcpy(zPath, "/cygdrive/", 10); |
| 186 | | - zPath[10] = zUtf8[0]; |
| 187 | | - memcpy(zPath+11, zUtf8+2, n-1); |
| 191 | + /* win32 absolute path starting with drive specifier. */ |
| 192 | + int nByte; |
| 193 | + wchar_t zUnicode[2000]; |
| 194 | + wchar_t *wUnicode = zUnicode; |
| 195 | + MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, count(zUnicode)); |
| 196 | + while( *wUnicode != '\0' ){ |
| 197 | + if( *wUnicode == '/' ){ |
| 198 | + *wUnicode = '\\'; |
| 199 | + } |
| 200 | + ++wUnicode; |
| 201 | + } |
| 202 | + nByte = cygwin_conv_path(CCP_WIN_W_TO_POSIX, zUnicode, NULL, 0); |
| 203 | + zPath = fossil_malloc(nByte); |
| 204 | + cygwin_conv_path(CCP_WIN_W_TO_POSIX, zUnicode, zPath, nByte); |
| 188 | 205 | } else { |
| 189 | 206 | zPath = fossil_strdup(zUtf8); |
| 190 | | - } |
| 191 | | - zUtf8 = p = zPath; |
| 192 | | - while( (*p = *zUtf8++) != 0){ |
| 193 | | - if (*p++ == '\\' ) { |
| 194 | | - p[-1] = '/'; |
| 207 | + zUtf8 = p = zPath; |
| 208 | + while( (*p = *zUtf8++) != 0){ |
| 209 | + if (*p++ == '\\' ) { |
| 210 | + p[-1] = '/'; |
| 211 | + } |
| 195 | 212 | } |
| 196 | 213 | } |
| 197 | 214 | return zPath; |
| 198 | 215 | #elif defined(__APPLE__) && !defined(WITHOUT_ICONV) |
| 199 | 216 | return fossil_strdup(zUtf8); |
| 200 | 217 | |