/*++ Copyright (c) 1991-1999, Microsoft Corporation All rights reserved. Module Name: nlstrans.h Abstract: This file contains the header information shared by all of the modules of the NLSTRANS utility. Revision History: 07-30-91 JulieB Created. 03-10-00 lguindon Began GEO API port. 09-12-00 JulieB Fixed buffer sizes from GEO port. --*/ //////////////////////////////////////////////////////////////////////////// // // Includes Files. // //////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include //////////////////////////////////////////////////////////////////////////// // // Constant Declarations. // //////////////////////////////////////////////////////////////////////////// // // Define boolean constants. // #define FALSE 0 #define TRUE 1 // // Table Sizes. // #define MAX 256 // max buffer size #define MB_TABLE_SIZE 256 // size of MB table #define GLYPH_TABLE_SIZE MB_TABLE_SIZE // size of Glyph table #define DBCS_TABLE_SIZE 256 // size of DBCS table #define DBCS_OFFSET_SIZE 256 // size of DBCS offset area #define WC_TABLE_SIZE (64 * 1024) // size of WC table (char cnt) #define TABLE_SIZE_8 256 // size for 8:4:4 array (8) #define TABLE_SIZE_4 16 // size for 8:4:4 array (4) #define MAX_844_TBL_SIZE (64 * 1024) // max size of 8:4:4 table #define FILE_NAME_LEN 10 // max length of a file name #define MAX_NUM_LEADBYTE 12 // max number of DBCS lead bytes #define SKEY_TBL_SIZE (64 * 1024) // size of SORTKEY default table #define MAX_CT_MAP_TBL_SIZE 256 // max size of CTYPE Mapping table #define MAX_FONTSIGNATURE 16 // max size of font signature // // Geo Table Sizes. // #define MAX_SIGNATURE 4 // max size of signature #define MAX_LATITUDE 12 // max size of latitude #define MAX_LONGITUDE 12 // max size of longitude #define MAX_ISO_ABBREV 4 // max size of iso abbreviations // // Special Flags. // #define DUPLICATE_OFFSET TABLE_SIZE_4 // offset to duplicate flag (ctype) #define CP_ACP 0 // default to ANSI code page // // String Constants for Data Files. // #define CP_PREFIX "c_" #define DATA_FILE_SUFFIX ".nls" #define NLP_FILE_SUFFIX ".nlp" #define DATA_FILE_SUFFIX_W L".nls" #define NLP_FILE_SUFFIX_W L".nlp" #define LANGUAGE_FILE "l_intl.nls" #define LANG_EXCEPT_FILE "l_except.nls" #define LOCALE_FILE "locale.nls" #define UNICODE_FILE "unicode.nls" #define CTYPE_FILE "ctype.nls" #define SORTKEY_FILE "sortkey.nls" #define SORTTBLS_FILE "sorttbls.nls" #define SORTKEY_NLP_FILE "sortkey.nlp" #define SORTTBLS_NLP_FILE "sorttbls.nlp" #define GEOFILE "geo.nls" // // Flags denoting which tables to write to the output files. // #define F_CPINFO 0x80000000 #define F_MB 0x00000001 #define F_GLYPH 0x00000002 #define F_DBCS 0x00000004 #define F_WC 0x00000008 #define F_UPPER 0x00000010 #define F_LOWER 0x00000020 #define F_ADIGIT 0x00000100 #define F_CZONE 0x00000200 #define F_COMP 0x00000400 #define F_HIRAGANA 0x00001000 #define F_KATAKANA 0x00002000 #define F_HALFWIDTH 0x00004000 #define F_FULLWIDTH 0x00008000 #define F_TRADITIONAL 0x00010000 #define F_SIMPLIFIED 0x00020000 #define F_CTYPE_1 0x00010000 #define F_CTYPE_2 0x00020000 #define F_CTYPE_3 0x00040000 #define F_DEFAULT_SORTKEY 0x00100000 #define F_REVERSE_DW 0x00200000 #define F_DOUBLE_COMPRESS 0x00400000 #define F_MULTIPLE_WEIGHTS 0x00800000 #define F_EXPANSION 0x01000000 #define F_EXCEPTION 0x02000000 #define F_COMPRESSION 0x04000000 #define F_IDEOGRAPH_LCID 0x08000000 #define F_JAMOSORT 0x10000000 #define JAMO_INDEX_SIZE 0x100 #define JAMO_INDEX_RANGE 0xffff #define FIRST_JAMO 0x1100 #define LAST_JAMO 0x11ff //////////////////////////////////////////////////////////////////////////// // // Typedef Declarations. // //////////////////////////////////////////////////////////////////////////// typedef unsigned long DWORD; typedef unsigned short WORD; typedef unsigned char BYTE; typedef int BOOL; typedef void *PVOID; typedef unsigned int UINT; typedef char *PSZ; typedef DWORD LCID; typedef unsigned short WCHAR; typedef char CHAR; typedef WORD *PMB_TBL; typedef WORD *PGLYPH_TBL; typedef PVOID *PDBCS_TBL_ARRAY; typedef WORD *PDBCS_TBL; typedef WORD *PDBCS_OFFSETS; typedef struct dbcs_range_s { WORD LowRange; WORD HighRange; PDBCS_TBL_ARRAY pDBCSTbls; } DBCS_RANGE, *PDBCS_RANGE; typedef PDBCS_RANGE *PDBCS_ARRAY; typedef PVOID *P844_ARRAY; typedef PVOID PWC_ARRAY; typedef P844_ARRAY PCT_ARRAY; typedef P844_ARRAY PUP_ARRAY; typedef P844_ARRAY PLO_ARRAY; typedef P844_ARRAY PAD_ARRAY; typedef P844_ARRAY PCZ_ARRAY; typedef P844_ARRAY PHG_ARRAY; typedef P844_ARRAY PKK_ARRAY; typedef P844_ARRAY PHW_ARRAY; typedef P844_ARRAY PFW_ARRAY; typedef P844_ARRAY PTR_ARRAY; typedef P844_ARRAY PSP_ARRAY; typedef P844_ARRAY PPCOMP_ARRAY; typedef P844_ARRAY PCOMP_ARRAY; typedef WORD *PCOMP_GRID; //////////////////////////////////////// // // CODEPAGE File Structures. // //////////////////////////////////////// typedef struct codepage_s { PMB_TBL pMB; // ptr to MB array (1:1) PGLYPH_TBL pGlyph; // ptr to Glyph array (1:1) PDBCS_ARRAY pDBCS; // ptr to DBCS info PDBCS_OFFSETS pDBCSOff; // ptr to DBCS offset area PWC_ARRAY pWC; // ptr to WC 8:4:4 info DWORD WriteFlags; // which tables to write int NumDBCSRanges; // number of DBCS Ranges PSZ pszName; // ptr to codepage name (value) int CodePageValue; // code page value int MaxCharSize; // max character length WORD DefaultChar; // default character (mbcs) WORD UniDefaultChar; // unicode default char WORD TransDefChar; // translation of default char (unicode) WORD TransUniDefChar; // translation of uni def char (mbcs) BYTE LeadBytes[MAX_NUM_LEADBYTE]; } CODEPAGE, *PCODEPAGE; #define CP_INFO_SIZE 13 // size of CPINFO + 1 (in words) //////////////////////////////////////// // // LANGUAGE File Structures. // //////////////////////////////////////// typedef struct language_s { PUP_ARRAY pUpper; // ptr to UPPERCASE 8:4:4 info PLO_ARRAY pLower; // ptr to LOWERCASE 8:4:4 info DWORD WriteFlags; // tables to write int IfDefault; // 1 for default file, 0 otherwise int UPBuf2; // number UPPERCASE Buffer 2 int UPBuf3; // number UPPERCASE Buffer 3 int LOBuf2; // number LOWERCASE Buffer 2 int LOBuf3; // number LOWERCASE Buffer 3 } LANGUAGE, *PLANGUAGE; typedef struct l_except_hdr_s { DWORD Locale; // locale id DWORD Offset; // offset to exception nodes DWORD NumUpEntries; // number of upper case entries DWORD NumLoEntries; // number of lower case entries } L_EXCEPT_HDR, *PL_EXCEPT_HDR; typedef struct l_except_node_s { WORD UCP; // unicode code point WORD AddAmount; // amount to add to initial code point } L_EXCEPT_NODE, *PL_EXCEPT_NODE; typedef PL_EXCEPT_NODE *PL_EXCEPT_TBL; // ptr to array of exception nodes #define NUM_L_EXCEPT_WORDS (sizeof(L_EXCEPT_NODE) / sizeof(WORD)) typedef struct lang_except_s { int NumException; // number of EXCEPTION locales PL_EXCEPT_HDR pExceptHdr; // ptr to language exception header PL_EXCEPT_TBL pExceptTbl; // ptr to language exception table } LANG_EXCEPT, *PLANG_EXCEPT; //////////////////////////////////////// // // UNICODE File Structures. // //////////////////////////////////////// typedef struct unicode_s { PAD_ARRAY pADigit; // ptr to ASCIIDIGITS 8:4:4 info PCZ_ARRAY pCZone; // ptr to FOLDCZONE 8:4:4 info PHG_ARRAY pHiragana; // ptr to HIRAGANA 8:4:4 info PKK_ARRAY pKatakana; // ptr to KATAKANA 8:4:4 info PHW_ARRAY pHalfWidth; // ptr to HALFWIDTH 8:4:4 info PFW_ARRAY pFullWidth; // ptr to FULLWIDTH 8:4:4 info PTR_ARRAY pTraditional; // ptr to TRADITIONAL 8:4:4 info PSP_ARRAY pSimplified; // ptr to SIMPLIFIED 8:4:4 info PPCOMP_ARRAY pPreComp; // ptr to PRECOMPOSED 8:4:4 info PCOMP_ARRAY pBase; // ptr to COMPOSITE Base 8:4:4 PCOMP_ARRAY pNonSp; // ptr to COMPOSITE NonSpace 8:4:4 PCOMP_GRID pCompGrid; // ptr to COMPOSITE 2D Grid int NumBase; // total number of BASE characters int NumNonSp; // total number of NONSPACE characters DWORD WriteFlags; // tables to write int ADBuf2; // number ASCIIDIGITS Buffer 2 int ADBuf3; // number ASCIIDIGITS Buffer 3 int CZBuf2; // number FOLDCZONE Buffer 2 int CZBuf3; // number FOLDCZONE Buffer 3 int HGBuf2; // number HIRAGANA Buffer 2 int HGBuf3; // number HIRAGANA Buffer 3 int KKBuf2; // number KATAKANA Buffer 2 int KKBuf3; // number KATAKANA Buffer 3 int HWBuf2; // number HALFWIDTH Buffer 2 int HWBuf3; // number HALFWIDTH Buffer 3 int FWBuf2; // number FULLWIDTH Buffer 2 int FWBuf3; // number FULLWIDTH Buffer 3 int TRBuf2; // number TRADITIONAL Buffer 2 int TRBuf3; // number TRADITIONAL Buffer 3 int SPBuf2; // number SIMPLIFIED Buffer 2 int SPBuf3; // number SIMPLIFIED Buffer 3 int PCBuf2; // number PRECOMPOSED Buffer 2 int PCBuf3; // number PRECOMPOSED Buffer 3 int BSBuf2; // number COMPOSITE BASE Buffer 2 int BSBuf3; // number COMPOSITE BASE Buffer 3 int NSBuf2; // number COMPOSITE NONSPACE Buffer 2 int NSBuf3; // number COMPOSITE NONSPACE Buffer 3 } UNICODE, *PUNICODE; //////////////////////////////////////// // // CTYPE File Structures. // //////////////////////////////////////// typedef struct ct_values_s { WORD CType1; // ctype 1 value WORD CType2; // ctype 2 value WORD CType3; // ctype 3 value } CT_VALUES, *PCT_VALUES; typedef BYTE CT_MAP_VALUE, *PCT_MAP_VALUE; typedef struct ct_map_s { int Length; // length of mapping table PCT_VALUES pCTValues; // table of CTYPE values } CT_MAP, *PCT_MAP; typedef struct ctypes_s { PCT_ARRAY pCType; // ptr to CTYPE 8:4:4 info PCT_MAP pMap; // ptr to mapping table DWORD WriteFlags; // tables to write int CTBuf2; // number CTYPE Buffer 2 int CTBuf3; // number CTYPE Buffer 3 } CTYPES, *PCTYPES; //////////////////////////////////////// // // SORTKEY & SORTTBLS File Structures. // //////////////////////////////////////// typedef struct skey_s { BYTE Alpha; // alphanumeric weight BYTE Script; // script member BYTE Diacritic; // diacritic weight BYTE Case; // case weight (incl. compression) } SKEY, *PSKEY; typedef struct sortkey_s { PSKEY pDefault; // ptr to DEFAULT SORTKEY info DWORD WriteFlags; // tables to write } SORTKEY, *PSORTKEY; typedef DWORD REV_DW; typedef REV_DW *PREV_DW; typedef DWORD DBL_COMPRESS; typedef DBL_COMPRESS *PDBL_COMPRESS; typedef struct ideograph_lcid_s { DWORD Locale; // locale id WORD pFileName[14]; // ptr to file name } IDEOGRAPH_LCID, *PIDEOGRAPH_LCID; typedef struct expand_s { WORD CP1; // code point 1 - expansion WORD CP2; // code point 2 - expansion } EXPAND, *PEXPAND; typedef struct compress_hdr_s { DWORD Locale; // locale id DWORD Offset; // offset to compression nodes WORD Num2; // number of 2 entries for lang id WORD Num3; // number of 3 entries for lang id } COMPRESS_HDR, *PCOMPRESS_HDR; typedef struct compress_2_node_s { WORD UCP1; // unicode code point 1 WORD UCP2; // unicode code point 2 BYTE Alpha; // alphanumeric weight BYTE Script; // script member BYTE Diacritic; // diacritic weight BYTE Case; // case weight } COMPRESS_2_NODE, *PCOMPRESS_2_NODE; typedef struct compress_3_node_s { WORD UCP1; // unicode code point 1 WORD UCP2; // unicode code point 2 WORD UCP3; // unicode code point 3 WORD Reserved; // dword alignment of structure BYTE Alpha; // alphanumeric weight BYTE Script; // script member BYTE Diacritic; // diacritic weight BYTE Case; // case weight } COMPRESS_3_NODE, *PCOMPRESS_3_NODE; typedef PCOMPRESS_2_NODE *PCOMPRESS_2_TBL; // ptr to array of compression 2 nodes typedef PCOMPRESS_3_NODE *PCOMPRESS_3_TBL; // ptr to array of compression 3 nodes #define NUM_COMPRESS_2_WORDS (sizeof(COMPRESS_2_NODE) / sizeof(WORD)) #define NUM_COMPRESS_3_WORDS (sizeof(COMPRESS_3_NODE) / sizeof(WORD)) typedef struct except_hdr_s { DWORD Locale; // locale id DWORD Offset; // offset to exception nodes DWORD NumEntries; // number of entries for locale id } EXCEPT_HDR, *PEXCEPT_HDR; typedef struct except_node_s { WORD UCP; // unicode code point BYTE Alpha; // alphanumeric weight BYTE Script; // script member BYTE Diacritic; // diacritic weight BYTE Case; // case weight } EXCEPT_NODE, *PEXCEPT_NODE; typedef PEXCEPT_NODE *PEXCEPT_TBL; // ptr to array of exception nodes #define NUM_EXCEPT_WORDS (sizeof(EXCEPT_NODE) / sizeof(WORD)) typedef struct multi_wt_s { BYTE FirstSM; // value of first script member BYTE NumSM; // number of script members in range } MULTI_WT, *PMULTI_WT; // Jamo Sequence Sorting Info: typedef struct { BYTE IsOldHangul; // Sequence occurs only in old Hangul flag BYTE LeadingIndex; // Indices used to locate the prior modern Hangul syllable BYTE VowelIndex; BYTE TrailingIndex; BYTE ExtraWeight; // Extra weights that distinguish this from other old Hangul syllables, // depending on the jamo, this can be a weight for leading jamo, // vowel jamo, or trailing jamo. } JAMO_SORT_INFO, *PJAMO_SORT_INFO; // Jamo Index Table Entry: typedef struct { JAMO_SORT_INFO SortInfo; // Sequence sorting info BYTE Index; // Index into the composition array. BYTE TransitionCount; // Number of possible transitions from this state BYTE Reserved; // Reserved byte. To make this structure aligned with WORD. } JAMO_TABLE, *PJAMO_TABLE; // Jamo Composition Table Entry: typedef struct { WCHAR CodePoint; // Code point value that enters this state JAMO_SORT_INFO SortInfo; // Sequence sorting info BYTE TransitionCount; // Number of possible transitions from this state } JAMO_COMPOSE_STATE, *PJAMO_COMPOSE_STATE; typedef struct sort_tables_s { int NumReverseDW; // number of REVERSE DIACRITICS int NumDblCompression; // number of DOUBLE COMPRESSION locales int NumIdeographLcid; // number of IDEOGRAPH LCIDs int NumExpansion; // number of EXPANSIONS int NumException; // number of EXCEPTION locales int NumCompression; // number of COMPRESSION locales int NumMultiWeight; // number of MULTIPLE WEIGHTS int NumJamoIndex; // number of Jamo Index table int NumJamoComposition; // number of Jamo Composition table PREV_DW pReverseDW; // ptr to REVERSE DIACRITICS info PDBL_COMPRESS pDblCompression; // ptr to DOUBLE COMPRESSION info PIDEOGRAPH_LCID pIdeographLcid; // ptr to ideograph lcid table PEXPAND pExpansion; // ptr to EXPANSION info PEXCEPT_HDR pExceptHdr; // ptr to exception header PEXCEPT_TBL pExceptTbl; // ptr to exception table PCOMPRESS_HDR pCompressHdr; // ptr to compression header PCOMPRESS_2_TBL pCompress2Tbl; // ptr to compression 2 table PCOMPRESS_3_TBL pCompress3Tbl; // ptr to compression 3 table PMULTI_WT pMultiWeight; // ptr to MULTIPLE WEIGHTS info PJAMO_TABLE pJamoIndexTbl; // ptr to Jamo Index table PJAMO_COMPOSE_STATE pJamoComposeTbl; // ptr to Jamo Composition table DWORD WriteFlags; // tables to write } SORT_TABLES, *PSORT_TABLES; typedef struct ideograph_node_s { WORD UCP; // unicode code point BYTE Alpha; // alphanumeric weight BYTE Script; // script member } IDEOGRAPH_NODE, *PIDEOGRAPH_NODE; typedef struct ideograph_node_ex_s { WORD UCP; // unicode code point BYTE Alpha; // alphanumeric weight BYTE Script; // script member BYTE Diacritic; // diacritic weight BYTE Case; // case weight } IDEOGRAPH_NODE_EX, *PIDEOGRAPH_NODE_EX; typedef struct ideograph_except_s { DWORD NumEntries; // number of entries DWORD NumColumns; // number of columns in table BYTE pFileName[14]; // ptr to file name - ANSI PIDEOGRAPH_NODE pExcept; // ptr to except nodes PIDEOGRAPH_NODE_EX pExceptEx; // ptr to except nodes ex } IDEOGRAPH_EXCEPT, *PIDEOGRAPH_EXCEPT; typedef struct loc_cal_hdr_s { DWORD NumLocales; // number of locales DWORD NumCalendars; // number of calendars DWORD CalOffset; // offset to calendar info (words) } LOC_CAL_HDR, *PLOC_CAL_HDR; #define LOC_NUM_CAL_WORDS 2 // number of words to NumCalendars #define LOC_CAL_HDR_WORDS (sizeof(LOC_CAL_HDR) / sizeof(WORD)) //////////////////////////////////////// // // LOCALE File Structures. // //////////////////////////////////////// typedef struct locale_hdr_s { DWORD Locale; // locale id DWORD Offset; // offset to locale info (words) } LOCALE_HDR, *PLOCALE_HDR; #define LOCALE_HDR_WORDS (sizeof(LOCALE_HDR) / sizeof(WORD)) typedef struct locale_header_s { WORD SLanguage; // language name in English WORD SAbbrevLang; // abbreviated language name WORD SAbbrevLangISO; // ISO abbreviated language name WORD SNativeLang; // native language name WORD SCountry; // country name in English WORD SAbbrevCtry; // abbreviated country name WORD SAbbrevCtryISO; // ISO abbreviated country name WORD SNativeCtry; // native country name WORD SList; // list separator WORD SDecimal; // decimal separator WORD SThousand; // thousands separator WORD SGrouping; // grouping of digits WORD SNativeDigits; // native digits 0-9 WORD SCurrency; // local monetary symbol WORD SIntlSymbol; // international monetary symbol WORD SEngCurrName; // currency name in English WORD SNativeCurrName; // native currency name WORD SMonDecSep; // monetary decimal separator WORD SMonThousSep; // monetary thousands separator WORD SMonGrouping; // monetary grouping of digits WORD SPositiveSign; // positive sign WORD SNegativeSign; // negative sign WORD STimeFormat; // time format WORD STime; // time separator WORD S1159; // AM designator WORD S2359; // PM designator WORD SShortDate; // short date format WORD SDate; // date separator WORD SYearMonth; // year month format WORD SLongDate; // long date format WORD IOptionalCalendar; // additional calendar type(s) WORD SDayName1; // day name 1 WORD SDayName2; // day name 2 WORD SDayName3; // day name 3 WORD SDayName4; // day name 4 WORD SDayName5; // day name 5 WORD SDayName6; // day name 6 WORD SDayName7; // day name 7 WORD SAbbrevDayName1; // abbreviated day name 1 WORD SAbbrevDayName2; // abbreviated day name 2 WORD SAbbrevDayName3; // abbreviated day name 3 WORD SAbbrevDayName4; // abbreviated day name 4 WORD SAbbrevDayName5; // abbreviated day name 5 WORD SAbbrevDayName6; // abbreviated day name 6 WORD SAbbrevDayName7; // abbreviated day name 7 WORD SMonthName1; // month name 1 WORD SMonthName2; // month name 2 WORD SMonthName3; // month name 3 WORD SMonthName4; // month name 4 WORD SMonthName5; // month name 5 WORD SMonthName6; // month name 6 WORD SMonthName7; // month name 7 WORD SMonthName8; // month name 8 WORD SMonthName9; // month name 9 WORD SMonthName10; // month name 10 WORD SMonthName11; // month name 11 WORD SMonthName12; // month name 12 WORD SMonthName13; // month name 13 WORD SAbbrevMonthName1; // abbreviated month name 1 WORD SAbbrevMonthName2; // abbreviated month name 2 WORD SAbbrevMonthName3; // abbreviated month name 3 WORD SAbbrevMonthName4; // abbreviated month name 4 WORD SAbbrevMonthName5; // abbreviated month name 5 WORD SAbbrevMonthName6; // abbreviated month name 6 WORD SAbbrevMonthName7; // abbreviated month name 7 WORD SAbbrevMonthName8; // abbreviated month name 8 WORD SAbbrevMonthName9; // abbreviated month name 9 WORD SAbbrevMonthName10; // abbreviated month name 10 WORD SAbbrevMonthName11; // abbreviated month name 11 WORD SAbbrevMonthName12; // abbreviated month name 12 WORD SAbbrevMonthName13; // abbreviated month name 13 WORD SEndOfLocale; // end of the locale info } LOCALE_HEADER, *PLOCALE_HEADER; typedef struct locale_static_s { WORD DefaultACP; // default ACP - integer format WORD szILanguage[5]; // language id WORD szICountry[6]; // country id WORD szIGeoId[8]; // Geographical Location Identifier WORD szIDefaultLang[5]; // default language ID WORD szIDefaultCtry[6]; // default country ID WORD szIDefaultACP[6]; // default ansi code page ID WORD szIDefaultOCP[6]; // default oem code page ID WORD szIDefaultMACCP[6]; // default mac code page ID WORD szIDefaultEBCDICCP[6]; // default ebcdic code page ID WORD szIMeasure[2]; // system of measurement WORD szIPaperSize[2]; // default paper size WORD szIDigits[3]; // number of fractional digits WORD szILZero[2]; // leading zeros for decimal WORD szINegNumber[2]; // negative number format WORD szIDigitSubstitution[2]; // digit substitution WORD szICurrDigits[3]; // # local monetary fractional digits WORD szIIntlCurrDigits[3]; // # intl monetary fractional digits WORD szICurrency[2]; // positive currency format WORD szINegCurr[3]; // negative currency format WORD szIPosSignPosn[2]; // format of positive sign WORD szIPosSymPrecedes[2]; // if mon symbol precedes positive WORD szIPosSepBySpace[2]; // if mon symbol separated by space WORD szINegSignPosn[2]; // format of negative sign WORD szINegSymPrecedes[2]; // if mon symbol precedes negative WORD szINegSepBySpace[2]; // if mon symbol separated by space WORD szITime[2]; // time format WORD szITLZero[2]; // leading zeros for time field WORD szITimeMarkPosn[2]; // time marker position WORD szIDate[2]; // short date order WORD szICentury[2]; // century format (short date) WORD szIDayLZero[2]; // leading zeros for day field (short date) WORD szIMonLZero[2]; // leading zeros for month field (short date) WORD szILDate[2]; // long date order WORD szICalendarType[3]; // type of calendar to use WORD szIFirstDayOfWeek[2]; // which day is first in week WORD szIFirstWeekOfYear[2]; // which week is first in year WORD szFontSignature[MAX_FONTSIGNATURE]; // font signature } LOCALE_STATIC, *PLOCALE_STATIC; typedef struct locale_variable_s { WORD szSLanguage[MAX]; // language name in English WORD szSAbbrevLang[MAX]; // abbreviated language name WORD szSAbbrevLangISO[MAX]; // ISO abbreviated language name WORD szSNativeLang[MAX]; // native language name WORD szSCountry[MAX]; // country name in English WORD szSAbbrevCtry[MAX]; // abbreviated country name WORD szSAbbrevCtryISO[MAX]; // ISO abbreviated country name WORD szSNativeCtry[MAX]; // native country name WORD szSList[MAX]; // list separator WORD szSDecimal[MAX]; // decimal separator WORD szSThousand[MAX]; // thousands separator WORD szSGrouping[MAX]; // grouping of digits WORD szSNativeDigits[MAX]; // native digits 0-9 WORD szSCurrency[MAX]; // local monetary symbol WORD szSIntlSymbol[MAX]; // international monetary symbol WORD szSEngCurrName[MAX]; // currency name in English WORD szSNativeCurrName[MAX]; // native currency name WORD szSMonDecSep[MAX]; // monetary decimal separator WORD szSMonThousSep[MAX]; // monetary thousands separator WORD szSMonGrouping[MAX]; // monetary grouping of digits WORD szSPositiveSign[MAX]; // positive sign WORD szSNegativeSign[MAX]; // negative sign WORD szSTimeFormat[MAX]; // time format WORD szSTime[MAX]; // time separator WORD szS1159[MAX]; // AM designator WORD szS2359[MAX]; // PM designator WORD szSShortDate[MAX]; // short date format WORD szSDate[MAX]; // short date separator WORD szSYearMonth[MAX]; // year month format WORD szSLongDate[MAX]; // long date format WORD szIOptionalCalendar[MAX]; // additional calendar type(s) WORD szSDayName1[MAX]; // day name 1 WORD szSDayName2[MAX]; // day name 2 WORD szSDayName3[MAX]; // day name 3 WORD szSDayName4[MAX]; // day name 4 WORD szSDayName5[MAX]; // day name 5 WORD szSDayName6[MAX]; // day name 6 WORD szSDayName7[MAX]; // day name 7 WORD szSAbbrevDayName1[MAX]; // abbreviated day name 1 WORD szSAbbrevDayName2[MAX]; // abbreviated day name 2 WORD szSAbbrevDayName3[MAX]; // abbreviated day name 3 WORD szSAbbrevDayName4[MAX]; // abbreviated day name 4 WORD szSAbbrevDayName5[MAX]; // abbreviated day name 5 WORD szSAbbrevDayName6[MAX]; // abbreviated day name 6 WORD szSAbbrevDayName7[MAX]; // abbreviated day name 7 WORD szSMonthName1[MAX]; // month name 1 WORD szSMonthName2[MAX]; // month name 2 WORD szSMonthName3[MAX]; // month name 3 WORD szSMonthName4[MAX]; // month name 4 WORD szSMonthName5[MAX]; // month name 5 WORD szSMonthName6[MAX]; // month name 6 WORD szSMonthName7[MAX]; // month name 7 WORD szSMonthName8[MAX]; // month name 8 WORD szSMonthName9[MAX]; // month name 9 WORD szSMonthName10[MAX]; // month name 10 WORD szSMonthName11[MAX]; // month name 11 WORD szSMonthName12[MAX]; // month name 12 WORD szSMonthName13[MAX]; // month name 13 WORD szSAbbrevMonthName1[MAX]; // abbreviated month name 1 WORD szSAbbrevMonthName2[MAX]; // abbreviated month name 2 WORD szSAbbrevMonthName3[MAX]; // abbreviated month name 3 WORD szSAbbrevMonthName4[MAX]; // abbreviated month name 4 WORD szSAbbrevMonthName5[MAX]; // abbreviated month name 5 WORD szSAbbrevMonthName6[MAX]; // abbreviated month name 6 WORD szSAbbrevMonthName7[MAX]; // abbreviated month name 7 WORD szSAbbrevMonthName8[MAX]; // abbreviated month name 8 WORD szSAbbrevMonthName9[MAX]; // abbreviated month name 9 WORD szSAbbrevMonthName10[MAX]; // abbreviated month name 10 WORD szSAbbrevMonthName11[MAX]; // abbreviated month name 11 WORD szSAbbrevMonthName12[MAX]; // abbreviated month name 12 WORD szSAbbrevMonthName13[MAX]; // abbreviated month name 13 } LOCALE_VARIABLE, *PLOCALE_VARIABLE; typedef struct calendar_hdr_s { WORD Calendar; // calendar id WORD Offset; // offset to calendar info (words) } CALENDAR_HDR, *PCALENDAR_HDR; #define CALENDAR_HDR_WORDS (sizeof(CALENDAR_HDR) / sizeof(WORD)) typedef struct calendar_header_s { WORD NumRanges; // number of era ranges WORD IfNames; // if any day or month names exist WORD SCalendar; // calendar id WORD STwoDigitYearMax; // two digit year max WORD SEraRanges; // era ranges WORD SShortDate; // short date format WORD SYearMonth; // year month format WORD SLongDate; // long date format WORD SDayName1; // day name 1 WORD SDayName2; // day name 2 WORD SDayName3; // day name 3 WORD SDayName4; // day name 4 WORD SDayName5; // day name 5 WORD SDayName6; // day name 6 WORD SDayName7; // day name 7 WORD SAbbrevDayName1; // abbreviated day name 1 WORD SAbbrevDayName2; // abbreviated day name 2 WORD SAbbrevDayName3; // abbreviated day name 3 WORD SAbbrevDayName4; // abbreviated day name 4 WORD SAbbrevDayName5; // abbreviated day name 5 WORD SAbbrevDayName6; // abbreviated day name 6 WORD SAbbrevDayName7; // abbreviated day name 7 WORD SMonthName1; // month name 1 WORD SMonthName2; // month name 2 WORD SMonthName3; // month name 3 WORD SMonthName4; // month name 4 WORD SMonthName5; // month name 5 WORD SMonthName6; // month name 6 WORD SMonthName7; // month name 7 WORD SMonthName8; // month name 8 WORD SMonthName9; // month name 9 WORD SMonthName10; // month name 10 WORD SMonthName11; // month name 11 WORD SMonthName12; // month name 12 WORD SMonthName13; // month name 13 WORD SAbbrevMonthName1; // abbreviated month name 1 WORD SAbbrevMonthName2; // abbreviated month name 2 WORD SAbbrevMonthName3; // abbreviated month name 3 WORD SAbbrevMonthName4; // abbreviated month name 4 WORD SAbbrevMonthName5; // abbreviated month name 5 WORD SAbbrevMonthName6; // abbreviated month name 6 WORD SAbbrevMonthName7; // abbreviated month name 7 WORD SAbbrevMonthName8; // abbreviated month name 8 WORD SAbbrevMonthName9; // abbreviated month name 9 WORD SAbbrevMonthName10; // abbreviated month name 10 WORD SAbbrevMonthName11; // abbreviated month name 11 WORD SAbbrevMonthName12; // abbreviated month name 12 WORD SAbbrevMonthName13; // abbreviated month name 13 WORD SEndOfCalendar; // end of the calendar info } CALENDAR_HEADER, *PCALENDAR_HEADER; // size of the name header portion #define CAL_NAME_HDR_SIZE ((sizeof(CALENDAR_HEADER) - \ FIELD_OFFSET(CALENDAR_HEADER, SDayName2)) / \ sizeof(WORD)) typedef struct calendar_variable_s { WORD szSCalendar[MAX]; // calendar id WORD szSTwoDigitYearMax[MAX]; // two digit year max WORD szSEraRanges[MAX]; // era ranges WORD szSShortDate[MAX]; // short date format WORD szSYearMonth[MAX]; // year month format WORD szSLongDate[MAX]; // long date format WORD szSDayName1[MAX]; // day name 1 WORD szSDayName2[MAX]; // day name 2 WORD szSDayName3[MAX]; // day name 3 WORD szSDayName4[MAX]; // day name 4 WORD szSDayName5[MAX]; // day name 5 WORD szSDayName6[MAX]; // day name 6 WORD szSDayName7[MAX]; // day name 7 WORD szSAbbrevDayName1[MAX]; // abbreviated day name 1 WORD szSAbbrevDayName2[MAX]; // abbreviated day name 2 WORD szSAbbrevDayName3[MAX]; // abbreviated day name 3 WORD szSAbbrevDayName4[MAX]; // abbreviated day name 4 WORD szSAbbrevDayName5[MAX]; // abbreviated day name 5 WORD szSAbbrevDayName6[MAX]; // abbreviated day name 6 WORD szSAbbrevDayName7[MAX]; // abbreviated day name 7 WORD szSMonthName1[MAX]; // month name 1 WORD szSMonthName2[MAX]; // month name 2 WORD szSMonthName3[MAX]; // month name 3 WORD szSMonthName4[MAX]; // month name 4 WORD szSMonthName5[MAX]; // month name 5 WORD szSMonthName6[MAX]; // month name 6 WORD szSMonthName7[MAX]; // month name 7 WORD szSMonthName8[MAX]; // month name 8 WORD szSMonthName9[MAX]; // month name 9 WORD szSMonthName10[MAX]; // month name 10 WORD szSMonthName11[MAX]; // month name 11 WORD szSMonthName12[MAX]; // month name 12 WORD szSMonthName13[MAX]; // month name 13 WORD szSAbbrevMonthName1[MAX]; // abbreviated month name 1 WORD szSAbbrevMonthName2[MAX]; // abbreviated month name 2 WORD szSAbbrevMonthName3[MAX]; // abbreviated month name 3 WORD szSAbbrevMonthName4[MAX]; // abbreviated month name 4 WORD szSAbbrevMonthName5[MAX]; // abbreviated month name 5 WORD szSAbbrevMonthName6[MAX]; // abbreviated month name 6 WORD szSAbbrevMonthName7[MAX]; // abbreviated month name 7 WORD szSAbbrevMonthName8[MAX]; // abbreviated month name 8 WORD szSAbbrevMonthName9[MAX]; // abbreviated month name 9 WORD szSAbbrevMonthName10[MAX]; // abbreviated month name 10 WORD szSAbbrevMonthName11[MAX]; // abbreviated month name 11 WORD szSAbbrevMonthName12[MAX]; // abbreviated month name 12 WORD szSAbbrevMonthName13[MAX]; // abbreviated month name 13 } CALENDAR_VARIABLE, *PCALENDAR_VARIABLE; //////////////////////////////////////// // // GEO File Structures. // //////////////////////////////////////// typedef struct tagGeoData{ long GeoId; WCHAR szLatitude[MAX_LATITUDE]; WCHAR szLongitude[MAX_LONGITUDE]; DWORD GeoClass; long ParentGeoId; WCHAR szISO3166Abbrev2[MAX_ISO_ABBREV]; WCHAR szISO3166Abbrev3[MAX_ISO_ABBREV]; WORD wISO3166; WORD Reserved; // dword alignment } GEODATA, *PGEODATA; typedef struct tagGEOIDLCID{ LCID lcid; long GeoId; WORD LangId; WORD Reserved; // dword alignment } GEOLCID, *PGEOLCID; typedef struct tagGeoTableHdr{ WCHAR szSig[MAX_SIGNATURE]; unsigned long nFileSize; DWORD dwOffsetGeoInfo; unsigned long nGeoInfo; DWORD dwOffsetGeoLCID; unsigned long nGeoLCID; } GEOTABLEHDR; //////////////////////////////////////////////////////////////////////////// // // Macro Definitions. // //////////////////////////////////////////////////////////////////////////// // // Macro to make a DWORD from two WORDS. // #define MAKE_DWORD(a, b) ((long)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16)) // // Macros For High and Low Nibbles of a BYTE. // #define LONIBBLE(b) ((BYTE)((BYTE)(b) & 0xF)) #define HINIBBLE(b) ((BYTE)(((BYTE)(b) >> 4) & 0xF)) // // Macros for Extracting the 8:4:4 Index Values. // #define GET8(w) (HIBYTE(w)) #define GETHI4(w) (HINIBBLE(LOBYTE(w))) #define GETLO4(w) (LONIBBLE(LOBYTE(w))) // // Macro for getting the case weight and compression value byte. // #define MAKE_CASE_WT(cw, comp) ((BYTE)(((BYTE)(comp) << 6) | ((BYTE)(cw)))) //////////////////////////////////////////////////////////////////////////// // // Function Prototypes. // //////////////////////////////////////////////////////////////////////////// // // CodePage Routines. // int ParseCodePage( PCODEPAGE pCP, PSZ pszKeyWord); int WriteCodePage( PCODEPAGE pCP); // // Language Routines. // int ParseLanguage( PLANGUAGE pLang, PSZ pszKeyWord); int WriteLanguage( PLANGUAGE pLang); int ParseLangException( PLANG_EXCEPT pLangExcept, PSZ pszKeyWord); int WriteLangException( PLANG_EXCEPT pLangExcept); // // Locale Routines. // int ParseWriteLocale( PLOCALE_HEADER pLocHdr, PLOCALE_STATIC pLocStat, PLOCALE_VARIABLE pLocVar, PSZ pszKeyWord); // // Locale Independent (Unicode) Routines. // int ParseUnicode( PUNICODE pUnic, PSZ pszKeyWord); int WriteUnicode( PUNICODE pUnic); // // GEO Routines. // int ParseWriteGEO( PSZ pszKeyWord); // // Character Type Routines. // int ParseCTypes( PCTYPES pCType); int WriteCTypes( PCTYPES pCType); // // Sorting Routines. // int ParseSortkey( PSORTKEY pSortkey, PSZ pszKeyWord); int ParseSortTables( PSORT_TABLES pSortTbls, PSZ pszKeyWord); int ParseIdeographExceptions( PIDEOGRAPH_EXCEPT pIdeographExcept); int WriteSortkey( PSORTKEY pSortkey, char* SortKeyFileName); int WriteSortTables( PSORT_TABLES pSortTbls, char* SortTblsFileName); int WriteIdeographExceptions( PIDEOGRAPH_EXCEPT pIdeographExcept); // // Allocation and Free Routines. // int AllocateMB( PCODEPAGE pCP); int AllocateGlyph( PCODEPAGE pCP); int AllocateTopDBCS( PCODEPAGE pCP, int Size); int AllocateDBCS( PCODEPAGE pCP, int Low, int High, int Index); int AllocateWCTable( PCODEPAGE pCP, int Size); int Allocate8( P844_ARRAY *pArr); int Insert844( P844_ARRAY pArr, WORD WChar, DWORD Value, int *cbBuf2, int *cbBuf3, int Size); int Insert844Map( P844_ARRAY pArr, PCT_MAP pMap, WORD WChar, WORD Value1, WORD Value2, WORD Value3, int *cbBuf2, int *cbBuf3); int AllocateTemp844( PVOID *ppArr, int TblSize, int Size); int AllocateCTMap( PCT_MAP *pMap); int AllocateGrid( PCOMP_GRID *pCompGrid, int TblSize); int AllocateLangException( PLANG_EXCEPT pLangExcept, int TblSize); int AllocateLangExceptionNodes( PLANG_EXCEPT pLangExcept, int TblSize, int Index); int AllocateSortDefault( PSORTKEY pSKey); int AllocateReverseDW( PSORT_TABLES pSTbl, int TblSize); int AllocateDoubleCompression( PSORT_TABLES pSTbl, int TblSize); int AllocateIdeographLcid( PSORT_TABLES pSTbl, int TblSize); int AllocateExpansion( PSORT_TABLES pSTbl, int TblSize); int AllocateCompression( PSORT_TABLES pSTbl, int TblSize); int AllocateCompression2Nodes( PSORT_TABLES pSTbl, int TblSize, int Index); int AllocateCompression3Nodes( PSORT_TABLES pSTbl, int TblSize, int Index); int AllocateException( PSORT_TABLES pSTbl, int TblSize); int AllocateExceptionNodes( PSORT_TABLES pSTbl, int TblSize, int Index); int AllocateMultipleWeights( PSORT_TABLES pSTbl, int TblSize); int AllocateIdeographExceptions( PIDEOGRAPH_EXCEPT pIdeographExcept, int TblSize, int NumColumns); int AllocateJamoTables( PSORT_TABLES pSTbl, int TblSize); void Free844( P844_ARRAY pArr); void FreeCTMap( PCT_MAP pMap); // // Table Routines. // int ComputeMBSize( PCODEPAGE pCP); int Compute844Size( int cbBuf2, int cbBuf3, int Size); DWORD ComputeCTMapSize( PCT_MAP pMap); int Write844Table( FILE *pOutputFile, P844_ARRAY pArr, int cbBuf2, int TblSize, int Size); int Write844TableMap( FILE *pOutputFile, P844_ARRAY pArr, WORD TblSize); int WriteCTMapTable( FILE *pOutputFile, PCT_MAP pMap, WORD MapSize); int WriteWords( FILE *pOutputFile, WORD Value, int Num); int FileWrite( FILE *pOutputFile, void *Buffer, int Size, int Count, char *ErrStr); void RemoveDuplicate844Levels( P844_ARRAY pArr, int *pBuf2, int *pBuf3, int Size); // // Utility Routines. // int GetSize( int *pSize); //////////////////////////////////////////////////////////////////////////// // // Global Variables. // // Globals are included last because they may require some of the types // being defined above. // //////////////////////////////////////////////////////////////////////////// extern FILE *pInputFile; // pointer to Input File extern BOOL Verbose; // verbose flag extern WCHAR FileExtension[]; // The file extension for generated files. It can be ".nls" or ".nlp"