mirror of
https://github.com/dlang/phobos.git
synced 2025-04-27 13:40:20 +03:00

This ensures that the actual error message won't be suppressed when the lookup error code => message fails. The exception will also be more informative because `WindowsException` is explicitly intended for Windows API errors.
111 lines
3.1 KiB
D
111 lines
3.1 KiB
D
// Written in the D programming language.
|
|
|
|
/**
|
|
* Support UTF-8 on Windows 95, 98 and ME systems.
|
|
*
|
|
* Copyright: Copyright The D Language Foundation" 2005 - 2009.
|
|
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
|
|
* Authors: $(HTTP digitalmars.com, Walter Bright)
|
|
*/
|
|
/* Copyright The D Language Foundation" 2005 - 2009.
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
module std.windows.charset;
|
|
|
|
version (StdDdoc)
|
|
{
|
|
/******************************************
|
|
* Converts the UTF-8 string s into a null-terminated string in a Windows
|
|
* 8-bit character set.
|
|
*
|
|
* Params:
|
|
* s = UTF-8 string to convert.
|
|
* codePage = is the number of the target codepage, or
|
|
* 0 - ANSI,
|
|
* 1 - OEM,
|
|
* 2 - Mac
|
|
*
|
|
* Authors:
|
|
* yaneurao, Walter Bright, Stewart Gordon
|
|
*/
|
|
const(char)* toMBSz(scope const(char)[] s, uint codePage = 0);
|
|
|
|
/**********************************************
|
|
* Converts the null-terminated string s from a Windows 8-bit character set
|
|
* into a UTF-8 char array.
|
|
*
|
|
* Params:
|
|
* s = UTF-8 string to convert.
|
|
* codePage = is the number of the source codepage, or
|
|
* 0 - ANSI,
|
|
* 1 - OEM,
|
|
* 2 - Mac
|
|
* Authors: Stewart Gordon, Walter Bright
|
|
*/
|
|
string fromMBSz(immutable(char)* s, int codePage = 0);
|
|
}
|
|
else:
|
|
|
|
version (Windows):
|
|
|
|
import core.sys.windows.winbase, core.sys.windows.winnls;
|
|
import std.conv;
|
|
import std.string;
|
|
import std.windows.syserror;
|
|
|
|
import std.internal.cstring;
|
|
|
|
const(char)* toMBSz(scope const(char)[] s, uint codePage = 0)
|
|
{
|
|
// Only need to do this if any chars have the high bit set
|
|
foreach (char c; s)
|
|
{
|
|
if (c >= 0x80)
|
|
{
|
|
char[] result;
|
|
int readLen;
|
|
auto wsTmp = s.tempCStringW();
|
|
result.length = WideCharToMultiByte(codePage, 0, wsTmp, -1, null, 0,
|
|
null, null);
|
|
|
|
if (result.length)
|
|
{
|
|
readLen = WideCharToMultiByte(codePage, 0, wsTmp, -1, result.ptr,
|
|
to!int(result.length), null, null);
|
|
}
|
|
|
|
wenforce(readLen && readLen == result.length, "Couldn't convert string");
|
|
return result.ptr;
|
|
}
|
|
}
|
|
return std.string.toStringz(s);
|
|
}
|
|
|
|
string fromMBSz(return scope immutable(char)* s, int codePage = 0)
|
|
{
|
|
const(char)* c;
|
|
|
|
for (c = s; *c != 0; c++)
|
|
{
|
|
if (*c >= 0x80)
|
|
{
|
|
wchar[] result;
|
|
int readLen;
|
|
|
|
result.length = MultiByteToWideChar(codePage, 0, s, -1, null, 0);
|
|
|
|
if (result.length)
|
|
{
|
|
readLen = MultiByteToWideChar(codePage, 0, s, -1, result.ptr,
|
|
to!int(result.length));
|
|
}
|
|
|
|
wenforce(readLen && readLen == result.length, "Couldn't convert string");
|
|
|
|
return result[0 .. result.length-1].to!string; // omit trailing null
|
|
}
|
|
}
|
|
return s[0 .. c-s]; // string is ASCII, no conversion necessary
|
|
}
|