3 * FILE: dll/cpl/input/locale_list.c
5 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
8 #include "locale_list.h"
11 static LOCALE_LIST_NODE
*_LocaleList
= NULL
;
14 static LOCALE_LIST_NODE
*
15 LocaleList_Append(DWORD dwId
, const WCHAR
*pszName
)
17 LOCALE_LIST_NODE
*pCurrent
;
18 LOCALE_LIST_NODE
*pNew
;
23 pCurrent
= _LocaleList
;
25 pNew
= (LOCALE_LIST_NODE
*)malloc(sizeof(LOCALE_LIST_NODE
));
29 ZeroMemory(pNew
, sizeof(LOCALE_LIST_NODE
));
31 pNew
->pszName
= _wcsdup(pszName
);
32 if (pNew
->pszName
== NULL
)
46 while (pCurrent
->pNext
!= NULL
)
48 pCurrent
= pCurrent
->pNext
;
51 pNew
->pPrev
= pCurrent
;
52 pCurrent
->pNext
= pNew
;
60 LocaleList_Destroy(VOID
)
62 LOCALE_LIST_NODE
*pCurrent
;
64 if (_LocaleList
== NULL
)
67 pCurrent
= _LocaleList
;
69 while (pCurrent
!= NULL
)
71 LOCALE_LIST_NODE
*pNext
= pCurrent
->pNext
;
73 free(pCurrent
->pszName
);
84 LocaleList_Create(VOID
)
86 WCHAR szValue
[MAX_PATH
];
91 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
92 L
"SYSTEM\\CurrentControlSet\\Control\\Nls\\Language",
94 KEY_ENUMERATE_SUB_KEYS
| KEY_QUERY_VALUE
,
95 &hKey
) != ERROR_SUCCESS
)
100 dwSize
= ARRAYSIZE(szValue
);
103 while (RegEnumValueW(hKey
, dwIndex
, szValue
, &dwSize
,
104 NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
106 WCHAR szName
[MAX_STR_LEN
];
109 dwId
= DWORDfromString(szValue
);
111 if (GetLocaleInfoW(LOWORD(dwId
),
113 szName
, ARRAYSIZE(szName
)))
115 LocaleList_Append(dwId
, szName
);
118 dwSize
= ARRAYSIZE(szValue
);
129 LocaleList_GetByHkl(HKL hkl
)
131 LOCALE_LIST_NODE
*pCurrent
;
133 for (pCurrent
= _LocaleList
; pCurrent
!= NULL
; pCurrent
= pCurrent
->pNext
)
135 if (LOWORD(pCurrent
->dwId
) == LOWORD(hkl
))
146 LocaleList_GetFirst(VOID
)