• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ********************************************************************************
3 *   Copyright (C) 2005-2009, International Business Machines
4 *   Corporation and others.  All Rights Reserved.
5 ********************************************************************************
6 *
7 * File WINUTIL.CPP
8 *
9 ********************************************************************************
10 */
11 
12 #include "unicode/utypes.h"
13 
14 #ifdef U_WINDOWS
15 
16 #if !UCONFIG_NO_FORMATTING
17 
18 #include "winutil.h"
19 #include "locmap.h"
20 #include "unicode/uloc.h"
21 
22 #   define WIN32_LEAN_AND_MEAN
23 #   define VC_EXTRALEAN
24 #   define NOUSER
25 #   define NOSERVICE
26 #   define NOIME
27 #   define NOMCX
28 #   include <windows.h>
29 #   include <stdio.h>
30 #   include <string.h>
31 
32 static Win32Utilities::LCIDRecord *lcidRecords = NULL;
33 static int32_t lcidCount  = 0;
34 static int32_t lcidMax = 0;
35 
EnumLocalesProc(LPSTR lpLocaleString)36 BOOL CALLBACK EnumLocalesProc(LPSTR lpLocaleString)
37 {
38     const char* localeID = NULL;
39     UErrorCode status = U_ZERO_ERROR;
40 
41     if (lcidCount >= lcidMax) {
42         Win32Utilities::LCIDRecord *newRecords = new Win32Utilities::LCIDRecord[lcidMax + 32];
43 
44         for (int i = 0; i < lcidMax; i += 1) {
45             newRecords[i] = lcidRecords[i];
46         }
47 
48         delete[] lcidRecords;
49         lcidRecords = newRecords;
50         lcidMax += 32;
51     }
52 
53     sscanf(lpLocaleString, "%8x", &lcidRecords[lcidCount].lcid);
54 
55     localeID = uprv_convertToPosix(lcidRecords[lcidCount].lcid, &status);
56 
57     lcidRecords[lcidCount].localeID = new char[strlen(localeID)];
58 
59     strcpy(lcidRecords[lcidCount].localeID, localeID);
60 
61     lcidCount += 1;
62 
63     return TRUE;
64 }
65 
getLocales(int32_t & localeCount)66 Win32Utilities::LCIDRecord *Win32Utilities::getLocales(int32_t &localeCount)
67 {
68     LCIDRecord *result;
69 
70     EnumSystemLocalesA(EnumLocalesProc, LCID_INSTALLED);
71 
72     localeCount = lcidCount;
73     result      = lcidRecords;
74 
75     lcidCount = lcidMax = 0;
76     lcidRecords = NULL;
77 
78     return result;
79 }
80 
freeLocales(LCIDRecord * records)81 void Win32Utilities::freeLocales(LCIDRecord *records)
82 {
83     for (int i = 0; i < lcidCount; i++) {
84         delete lcidRecords[i].localeID;
85     }
86     delete[] records;
87 }
88 
89 #endif /* #if !UCONFIG_NO_FORMATTING */
90 
91 #endif /* #ifdef U_WINDOWS */
92