Download Reference Manual
The Developer's Library for D
About Wiki Forums Source Search Contact

Ticket #857: Win32.d

File Win32.d, 1.7 kB (added by Wazar, 2 years ago)
Line 
1 /*******************************************************************************
2
3         copyright:      Copyright (c) 2005 John Chapman. All rights reserved
4
5         license:        BSD style: $(LICENSE)
6
7         version:        Initial release: 2005
8
9         author:         John Chapman
10
11 ******************************************************************************/
12
13 module tango.text.locale.Win32;
14
15 version(Windows)
16 {
17 alias tango.text.locale.Win32 nativeMethods;
18
19 extern (Windows)
20 private {
21   uint GetUserDefaultLCID();
22   uint GetThreadLocale();
23   bool SetThreadLocale(uint Locale);
24   int MultiByteToWideChar(uint CodePage, uint dwFlags, char* lpMultiByteStr, int cbMultiByte, wchar* lpWideCharStr, int cchWideChar);
25   int CompareStringW(uint Locale, uint dwCmpFlags, wchar* lpString1, int cchCount1, wchar* lpString2, int cchCount2);
26
27 }
28
29 int getUserCulture() {
30   return GetUserDefaultLCID();
31 }
32
33 void setUserCulture(int lcid) {
34   SetThreadLocale(lcid);
35 }
36
37 int compareString(int lcid, char[] stringA, uint offsetA, uint lengthA, char[] stringB, uint offsetB, uint lengthB, bool ignoreCase) {
38
39   wchar[] toUnicode(char[] string, uint offset, uint length, out int translated) {
40     char* chars = string.ptr + offset;
41     int required = MultiByteToWideChar(0, 0, chars, length, null, 0);
42     wchar[] result = new wchar[required];
43     translated = MultiByteToWideChar(0, 0, chars, length, result.ptr, required);
44     return result;
45   }
46
47   int sortId = (lcid >> 16) & 0xF;
48   sortId = (sortId == 0) ? lcid : (lcid | (sortId << 16));
49
50   int len1, len2;
51   wchar[] string1 = toUnicode(stringA, offsetA, lengthA, len1);
52   wchar[] string2 = toUnicode(stringB, offsetB, lengthB, len2);
53
54   return CompareStringW(sortId, ignoreCase ? 0x1 : 0x0, string1.ptr, len1, string2.ptr, len2) - 2;
55 }
56 }