Home | History | Annotate | Download | only in intltest
      1 /*
      2 ********************************************************************************
      3 *   Copyright (C) 2005-2006, 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 
     21 #   define WIN32_LEAN_AND_MEAN
     22 #   define VC_EXTRALEAN
     23 #   define NOUSER
     24 #   define NOSERVICE
     25 #   define NOIME
     26 #   define NOMCX
     27 #   include <windows.h>
     28 #   include <stdio.h>
     29 
     30 static Win32Utilities::LCIDRecord *lcidRecords = NULL;
     31 static int32_t lcidCount  = 0;
     32 static int32_t lcidMax = 0;
     33 
     34 BOOL CALLBACK EnumLocalesProc(LPSTR lpLocaleString)
     35 {
     36     UErrorCode status = U_ZERO_ERROR;
     37 
     38     if (lcidCount >= lcidMax) {
     39         Win32Utilities::LCIDRecord *newRecords = new Win32Utilities::LCIDRecord[lcidMax + 32];
     40 
     41         for (int i = 0; i < lcidMax; i += 1) {
     42             newRecords[i] = lcidRecords[i];
     43         }
     44 
     45         delete[] lcidRecords;
     46         lcidRecords = newRecords;
     47         lcidMax += 32;
     48     }
     49 
     50     sscanf(lpLocaleString, "%8x", &lcidRecords[lcidCount].lcid);
     51 
     52     lcidRecords[lcidCount].localeID = uprv_convertToPosix(lcidRecords[lcidCount].lcid, &status);
     53 
     54     lcidCount += 1;
     55 
     56     return TRUE;
     57 }
     58 
     59 Win32Utilities::LCIDRecord *Win32Utilities::getLocales(int32_t &localeCount)
     60 {
     61     LCIDRecord *result;
     62 
     63     EnumSystemLocalesA(EnumLocalesProc, LCID_INSTALLED);
     64 
     65     localeCount = lcidCount;
     66     result      = lcidRecords;
     67 
     68     lcidCount = lcidMax = 0;
     69     lcidRecords = NULL;
     70 
     71     return result;
     72 }
     73 
     74 void Win32Utilities::freeLocales(LCIDRecord *records)
     75 {
     76     delete[] records;
     77 }
     78 
     79 #endif /* #if !UCONFIG_NO_FORMATTING */
     80 
     81 #endif /* #ifdef U_WINDOWS */
     82