?? getqloc.c
字號:
/***
*getqloc.c - get qualified locale
*
* Copyright (c) 1993-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines __get_qualified_locale - get complete locale information
*
*******************************************************************************/
#include <cruntime.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <setlocal.h>
#include <awint.h>
// local defines
#define __LCID_DEFAULT 0x1 // default language locale for country
#define __LCID_PRIMARY 0x2 // primary language locale for country
#define __LCID_FULL 0x4 // fully matched language locale for country
#define __LCID_LANGUAGE 0x100 // language default seen
#define __LCID_EXISTS 0x200 // language is installed
// local structure definitions
typedef struct tagLOCALETAB
{
CHAR * szName;
CHAR chAbbrev[4];
} LOCALETAB;
typedef struct tagRGLOCINFO
{
LCID lcid;
char chILanguage[8];
char * pchSEngLanguage;
char chSAbbrevLangName[4];
char * pchSEngCountry;
char chSAbbrevCtryName[4];
char chIDefaultCodepage[8];
char chIDefaultAnsiCodepage[8];
} RGLOCINFO;
// function prototypes
BOOL __cdecl __get_qualified_locale(const LPLC_STRINGS, LPLC_ID, LPLC_STRINGS);
static void TranslateName(LOCALETAB *, int, char **);
static void GetLcidFromLangCountry(void);
static BOOL CALLBACK LangCountryEnumProc(LPSTR);
static void GetLcidFromLanguage(void);
static BOOL CALLBACK LanguageEnumProc(LPSTR);
static void GetLcidFromCountry(void);
static BOOL CALLBACK CountryEnumProc(LPSTR);
static void GetLcidFromDefault(void);
static int ProcessCodePage(LPSTR);
static BOOL TestDefaultCountry(LCID);
static BOOL TestDefaultLanguage(LCID, BOOL);
static BOOL IsThisWindowsNT(void);
static int __stdcall crtGetLocaleInfoA(LCID, LCTYPE, LPSTR, int);
static LCID LcidFromHexString(LPSTR);
static int GetPrimaryLen(LPSTR);
// non-NLS language string table
__declspec(selectany) LOCALETAB __rg_language[] =
{
{"american", "ENU"},
{"american english", "ENU"},
{"american-english", "ENU"},
{"australian", "ENA"},
{"belgian", "NLB"},
{"canadian", "ENC"},
{"chh", "ZHH"},
{"chi", "ZHI"},
{"chinese", "CHS"},
{"chinese-hongkong", "ZHH"},
{"chinese-simplified", "CHS"},
{"chinese-singapore", "ZHI"},
{"chinese-traditional", "CHT"},
{"dutch-belgian", "NLB"},
{"english-american", "ENU"},
{"english-aus", "ENA"},
{"english-belize", "ENL"},
{"english-can", "ENC"},
{"english-caribbean", "ENB"},
{"english-ire", "ENI"},
{"english-jamaica", "ENJ"},
{"english-nz", "ENZ"},
{"english-south africa", "ENS"},
{"english-trinidad y tobago", "ENT"},
{"english-uk", "ENG"},
{"english-us", "ENU"},
{"english-usa", "ENU"},
{"french-belgian", "FRB"},
{"french-canadian", "FRC"},
{"french-luxembourg", "FRL"},
{"french-swiss", "FRS"},
{"german-austrian", "DEA"},
{"german-lichtenstein", "DEC"},
{"german-luxembourg", "DEL"},
{"german-swiss", "DES"},
{"irish-english", "ENI"},
{"italian-swiss", "ITS"},
{"norwegian", "NOR"},
{"norwegian-bokmal", "NOR"},
{"norwegian-nynorsk", "NON"},
{"portuguese-brazilian", "PTB"},
{"spanish-argentina", "ESS"},
{"spanish-bolivia", "ESB"},
{"spanish-chile", "ESL"},
{"spanish-colombia", "ESO"},
{"spanish-costa rica", "ESC"},
{"spanish-dominican republic", "ESD"},
{"spanish-ecuador", "ESF"},
{"spanish-el salvador", "ESE"},
{"spanish-guatemala", "ESG"},
{"spanish-honduras", "ESH"},
{"spanish-mexican", "ESM"},
{"spanish-modern", "ESN"},
{"spanish-nicaragua", "ESI"},
{"spanish-panama", "ESA"},
{"spanish-paraguay", "ESZ"},
{"spanish-peru", "ESR"},
{"spanish-puerto rico", "ESU"},
{"spanish-uruguay", "ESY"},
{"spanish-venezuela", "ESV"},
{"swedish-finland", "SVF"},
{"swiss", "DES"},
{"uk", "ENG"},
{"us", "ENU"},
{"usa", "ENU"}
};
// non-NLS country string table
__declspec( selectany ) LOCALETAB __rg_country[] =
{
{"america", "USA"},
{"britain", "GBR"},
{"china", "CHN"},
{"czech", "CZE"},
{"england", "GBR"},
{"great britain", "GBR"},
{"holland", "NLD"},
{"hong-kong", "HKG"},
{"new-zealand", "NZL"},
{"nz", "NZL"},
{"pr china", "CHN"},
{"pr-china", "CHN"},
{"puerto-rico", "PRI"},
{"slovak", "SVK"},
{"south africa", "ZAF"},
{"south korea", "KOR"},
{"south-africa", "ZAF"},
{"south-korea", "KOR"},
{"trinidad & tobago", "TTO"},
{"uk", "GBR"},
{"united-kingdom", "GBR"},
{"united-states", "USA"},
{"us", "USA"},
};
// LANGID's of locales of nondefault languages
__declspec( selectany ) LANGID __rglangidNotDefault[] =
{
MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_CANADIAN),
MAKELANGID(LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC),
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG),
MAKELANGID(LANG_AFRIKAANS, SUBLANG_DEFAULT),
MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_BELGIAN),
MAKELANGID(LANG_BASQUE, SUBLANG_DEFAULT),
MAKELANGID(LANG_CATALAN, SUBLANG_DEFAULT),
MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH_SWISS),
MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN_SWISS),
MAKELANGID(LANG_SWEDISH, SUBLANG_SWEDISH_FINLAND)
};
// locale information not supported in Win95
__declspec( selectany ) RGLOCINFO __rgLocInfo[] =
{
{ 0x040a, "040a", "Spanish - Traditional Sort", "ESP", "Spain",
"ESP", "850", "1252" },
{ 0x040b, "040b", "Finnish", "FIN", "Finland", "FIN", "850", "1252" },
{ 0x040c, "040c", "French", "FRA", "France", "FRA", "850", "1252" },
{ 0x040f, "040f", "Icelandic", "ISL", "Iceland", "ISL", "850", "1252" },
{ 0x041d, "041d", "Swedish", "SVE", "Sweden", "SWE", "850", "1252" },
{ 0x042d, "042d", "Basque", "EUQ", "Spain", "ESP", "850", "1252" },
{ 0x080a, "080a", "Spanish", "ESM", "Mexico", "MEX", "850", "1252" },
{ 0x080c, "080c", "French", "FRB", "Belgium", "BEL", "850", "1252" },
{ 0x0c07, "0c07", "German", "DEA", "Austria", "AUT", "850", "1252" },
{ 0x0c09, "0c09", "English", "ENA", "Australia", "AUS", "850", "1252" },
{ 0x0c0a, "0c0a", "Spanish - Modern Sort", "ESN", "Spain",
"ESP", "850", "1252" },
{ 0x0c0c, "0c0c", "French", "FRC", "Canada", "CAN", "850", "1252" },
{ 0x100a, "100a", "Spanish", "ESG", "Guatemala", "GTM", "850", "1252" },
{ 0x100c, "100c", "French", "FRS", "Switzerland", "CHE", "850", "1252" },
{ 0x140a, "140a", "Spanish", "ESC", "Costa Rica", "CRI", "850", "1252" },
{ 0x140c, "140c", "French", "FRL", "Luxembourg", "LUX", "850", "1252" },
{ 0x180a, "180a", "Spanish", "ESA", "Panama", "PAN", "850", "1252" },
{ 0x1c09, "1c09", "English", "ENS", "South Africa", "ZAF", "437", "1252" },
{ 0x1c0a, "1c0a", "Spanish", "ESD", "Dominican Republic",
"DOM", "850", "1252" },
{ 0x200a, "200a", "Spanish", "ESV", "Venezuela", "VEN", "850", "1252" },
{ 0x240a, "240a", "Spanish", "ESO", "Colombia", "COL", "850", "1252" },
{ 0x280a, "280a", "Spanish", "ESR", "Peru", "PER", "850", "1252" },
{ 0x2c0a, "2c0a", "Spanish", "ESS", "Argentina", "ARG", "850", "1252" },
{ 0x300a, "300a", "Spanish", "ESF", "Ecuador", "ECU", "850", "1252" },
{ 0x340a, "340a", "Spanish", "ESL", "Chile", "CHL", "850", "1252" },
{ 0x380a, "380a", "Spanish", "ESY", "Uruguay", "URY", "850", "1252" },
{ 0x3c0a, "3c0a", "Spanish", "ESZ", "Paraguay", "PRY", "850", "1252" }
};
// static variable to point to GetLocaleInfoA for Windows NT and
// crtGetLocaleInfoA for Win95
typedef int (__stdcall * PFNGETLOCALEINFOA)(LCID, LCTYPE, LPSTR, int);
static PFNGETLOCALEINFOA pfnGetLocaleInfoA = NULL;
// static variables used in locale enumeration callback routines
static char * pchLanguage;
static char * pchCountry;
static int iLcidState;
static int iPrimaryLen;
static BOOL bAbbrevLanguage;
static BOOL bAbbrevCountry;
static LCID lcidLanguage;
static LCID lcidCountry;
/***
*BOOL __get_qualified_locale - return fully qualified locale
*
*Purpose:
* get default locale, qualify partially complete locales
*
*Entry:
* lpInStr - input strings to be qualified
* lpOutId - pointer to numeric LCIDs and codepage output
* lpOutStr - pointer to string LCIDs and codepage output
*
*Exit:
* TRUE if success, qualified locale is valid
* FALSE if failure
*
*Exceptions:
*
*******************************************************************************/
BOOL __cdecl __get_qualified_locale(const LPLC_STRINGS lpInStr, LPLC_ID lpOutId,
LPLC_STRINGS lpOutStr)
{
int iCodePage;
// initialize pointer to call locale info routine based on operating system
if (!pfnGetLocaleInfoA)
{
pfnGetLocaleInfoA = IsThisWindowsNT() ? GetLocaleInfoA : crtGetLocaleInfoA;
}
if (!lpInStr)
{
// if no input defined, just use default LCID
GetLcidFromDefault();
}
else
{
// convert non-NLS language strings to three-letter abbreviations
pchLanguage = lpInStr->szLanguage;
if (pchLanguage && *pchLanguage)
TranslateName(__rg_language,
sizeof(__rg_language) / sizeof(LOCALETAB) - 1,
&pchLanguage);
// convert non-NLS country strings to three-letter abbreviations
pchCountry = lpInStr->szCountry;
if (pchCountry && *pchCountry)
TranslateName(__rg_country,
sizeof(__rg_country) / sizeof(LOCALETAB) - 1,
&pchCountry);
iLcidState = 0;
if (pchLanguage && *pchLanguage)
{
if (pchCountry && *pchCountry)
{
// both language and country strings defined
GetLcidFromLangCountry();
}
else
{
// language string defined, but country string undefined
GetLcidFromLanguage();
}
}
else
{
if (pchCountry && *pchCountry)
{
// country string defined, but language string undefined
GetLcidFromCountry();
}
else
{
// both language and country strings undefined
GetLcidFromDefault();
}
}
}
// test for error in LCID processing
if (!iLcidState)
return FALSE;
// process codepage value
iCodePage = ProcessCodePage(lpInStr->szCodePage);
// verify codepage validity
if (!iCodePage || !IsValidCodePage((WORD)iCodePage))
return FALSE;
// verify locale is installed
if (!IsValidLocale(lcidLanguage, LCID_INSTALLED))
return FALSE;
// set numeric LCID and codepage results
if (lpOutId)
{
lpOutId->wLanguage = LANGIDFROMLCID(lcidLanguage);
lpOutId->wCountry = LANGIDFROMLCID(lcidCountry);
lpOutId->wCodePage = (WORD)iCodePage;
}
// set string language, country, and codepage results
if (lpOutStr)
{
if ((*pfnGetLocaleInfoA)(lcidLanguage, LOCALE_SENGLANGUAGE,
lpOutStr->szLanguage, MAX_LANG_LEN) == 0)
return FALSE;
if ((*pfnGetLocaleInfoA)(lcidCountry, LOCALE_SENGCOUNTRY,
lpOutStr->szCountry, MAX_CTRY_LEN) == 0)
return FALSE;
_itoa((int)iCodePage, (char *)lpOutStr->szCodePage, 10);
}
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -