/* define the DLL export macro */ #if defined(_WIN32) && !defined(__CYGWIN32__) #define DLLEXPORT(res) __declspec(dllexport) res #else /* redef this default for your system */ #define DLLEXPORT(res) extern res #endif #ifdef COM #define COBJMACROS #define CINTERFACE #endif #include #if defined(_WIN32) && !defined(__CYGWIN32__) #include #define WCHAR wchar_t #else #ifdef __CYGWIN32__ #include #endif #include #define WCHAR wchar_t #endif #include "WideStringSrc.h" #ifdef COM #include "comPrim.h" #else #define UNI2STR(regstr, unistr) wcstombs (regstr, unistr, wcslen (unistr)+1) #endif /* wcslen() substitute implementation for cygwin'ers. */ #if defined(__CYGWIN32__) || defined(__CYGWIN__) /* Troublesome to use the one that comes with 20.1 of cygwin */ #ifdef MB_CUR_MAX #undef MB_CUR_MAX #endif #define MB_CUR_MAX 2 static int wcslen(WCHAR* wstr) { char str[MB_CUR_MAX]; char msg[80]; WCHAR* wptr; int nbytes, i = 0; wptr = wstr; if ( wptr == NULL ) return 0; while ( *wptr != L'\0' ) { nbytes = wctomb ( str, *wptr ); i += nbytes; (char*)wptr += nbytes; } return i; } #endif /* Return the length of a wide string big enough to hold the multi-byte string. */ unsigned int wideStringLen (char* str) { #ifdef _WIN32 return MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); #else /* Non Win32 specific version */ WCHAR foo[300]; // Ho-ho, bulletproof! unsigned int len; if (!str) { return 0; } else { len = mbstowcs (foo, str, strlen(str)); return ( (len < 0) ? 0 : len); } #endif } /* ToDo: sort out source code deps. and make the return type HRESULT. */ int wideToString ( WCHAR* wstr, char** pstr ) { int len; char* str; if (!pstr) { #ifdef _WIN32 return E_FAIL; #else return -1; #endif } #if defined(_WIN32) && defined(COM) /* Compute how big a buffer we need to allocate for multi-byte string... */ len = WideCharToMultiByte ( CP_ACP, 0, wstr, -1 , NULL, 0, NULL, NULL); if (len == 0) { return E_FAIL; } /* Ask COM task allocator for some memory. */ str = CoTaskMemAlloc(len * sizeof(char)); if (str == NULL) { return E_FAIL; } WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL); *pstr = str; return S_OK; #else len = wcslen(wstr); str=(char*)malloc(len+1); UNI2STR(str,wstr); *pstr = str; return 0; #endif } /* Converting (null-terminated) strings into wide/Unicode ones */ int primStringToWide( char* str, unsigned int len, WCHAR* wstr , unsigned int wlen ) { #ifdef _WIN32 return MultiByteToWideChar(CP_ACP, 0, str, len, wstr, wlen); #else int l; if ( wstr ) { if ( !str ) { *wstr = 0; return 0; } else { l = mbstowcs (wstr, str, wlen+1); return l; } } else { return (-1); } #endif } /* The proto might not be in scope, so you might just get a warning from the C compiler. Reluctant to define the proto, as experience has shown this to be troublesome (there appears to be no universal agreement as to what the return type of wcslen() is.) extern int wcslen (const WCHAR* wstr); extern size_t wcslen (const WCHAR* wstr); */ int lenWideString (WCHAR* wstr ) { return wcslen(wstr); }