[PATCH 3/5] shcore: Implement a bunch of string conversion functions.
Dmitry Timoshkov
dmitry at baikal.ru
Wed Nov 28 01:35:58 CST 2018
Nikolay Sivov <nsivov at codeweavers.com> wrote:
> +DWORD WINAPI SHAnsiToAnsi(const char *src, char *dest, int dest_len)
> +{
> + DWORD ret = 0;
> +
> + TRACE("(%s, %p, %d)\n", debugstr_a(src), dest, dest_len);
> +
> + if (!src || !dest || dest_len <= 0)
> + return 0;
> +
> + while (dest_len > 1 && *src)
> + {
> + dest_len--;
> + ret++;
> + *dest++ = *src++;
> + }
> +
> + if (dest_len)
> + {
> + *dest = 0;
> + ret++;
> + }
> +
> + return ret;
> +}
What is the reason to duplicate lstrcpynA?
> +DWORD WINAPI SHUnicodeToAnsi(const WCHAR *src, char *dest, int dest_len)
> +{
> + char *buff;
> + int len;
> +
> + TRACE("(%s, %p, %d)\n", debugstr_w(src), dest, dest_len);
> +
> + len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL);
> + buff = heap_alloc(len);
> + if (!buff)
> + return 0;
> +
> + WideCharToMultiByte(CP_ACP, 0, src, -1, buff, len, NULL, NULL);
> + len = SHAnsiToAnsi(buff, dest, dest_len);
> + heap_free(buff);
> + return len;
> +}
It should be possible to do without an intermediate memory allocation.
> +DWORD WINAPI SHUnicodeToUnicode(const WCHAR *src, WCHAR *dest, int dest_len)
> +{
> + DWORD ret = 0;
> +
> + TRACE("(%s, %p, %d)\n", debugstr_w(src), dest, dest_len);
> +
> + if (!src || !dest || dest_len <= 0)
> + return 0;
> +
> + while (dest_len > 1 && *src)
> + {
> + dest_len--;
> + ret++;
> + *dest++ = *src++;
> + }
> +
> + if (dest_len)
> + {
> + *dest = 0;
> + ret++;
> + }
> +
> + return ret;
> +}
What is the reason to duplicate lstrcpynW?
> +DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
> +{
> + WCHAR *buffW;
> + int len;
> +
> + TRACE("(%s, %p, %d)\n", debugstr_a(src), dest, dest_len);
> +
> + len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0);
> + buffW = heap_alloc(len * sizeof(*buffW));
> + if (!buffW)
> + return 0;
> +
> + MultiByteToWideChar(CP_ACP, 0, src, -1, buffW, len);
> + len = SHUnicodeToUnicode(buffW, dest, dest_len);
> + heap_free(buffW);
> + return len;
> +}
It should be possible to do without an intermediate memory allocation.
--
Dmitry.
More information about the wine-devel
mailing list