|
|
/*++
Copyright (c) 1991-1999, Microsoft Corporation All rights reserved.
Module Name:
locale.c
Abstract:
This file contains functions necessary to parse and write the locale specific tables to a data file.
External Routines in this file: ParseWriteLocale
Revision History:
12-10-91 JulieB Created. 03-10-00 lguindon Add explicit typecast to remove build errors --*/
//
// Include Files.
//
#include "nlstrans.h"
//
// Constant Declarations.
//
#define OPT_CAL_FLAG 1
#define ERA_RANGE_FLAG 2
//
// Forward Declarations.
//
int ParseLocaleInfo( PLOCALE_HEADER pLocHdr, PLOCALE_STATIC pLocStat, PLOCALE_VARIABLE pLocVar, PLOCALE_HEADER pLocCnt, PSZ pszKeyWord);
int ParseLine( PSZ pszLine, WORD *pInfo, int BufSize, BOOL fConvert);
int ParseMultiLine( PSZ pszLine, WORD *pInfo, int BufSize);
int ParseMultiLineSize( PSZ pszLine, WORD *pInfo, int BufSize, WORD *pNum, int Flag);
int GetLocaleInfoSize( int *pSize);
int ScanBuffer( PSZ pszLine, WORD *pInfo, int BufSize, BYTE *pszKey, BOOL fConvert);
int WriteLocaleInit( FILE **ppOutputFile, int NumLoc, int OffLoc);
int WriteLocaleInfo( DWORD Locale, int *pOffHdr, int *pOffLoc, PLOCALE_HEADER pLocHdr, PLOCALE_STATIC pLocStat, PLOCALE_VARIABLE pLocVar, PLOCALE_HEADER pLocCnt, FILE *pOutputFile);
int WriteVariableLength( PLOCALE_HEADER pLocCnt, PLOCALE_VARIABLE pLocVar, int *pTotalSize, FILE *pOutputFile);
int ParseWriteCalendar( PCALENDAR_HEADER pCalHdr, PCALENDAR_VARIABLE pCalVar, PSZ pszKeyWord, FILE *pOutputFile, int OffHdr);
int ParseCalendarInfo( PCALENDAR_HEADER pCalHdr, PCALENDAR_VARIABLE pCalVar, PCALENDAR_HEADER pCalCnt, PSZ pszKeyWord);
int WriteCalendarInit( FILE *pOutputFile, int NumCal, int OffCalHdr);
int WriteCalendarInfo( DWORD Calendar, int *pOffHdr, int *pOffCal, int OffCalBegin, PCALENDAR_HEADER pCalHdr, PCALENDAR_VARIABLE pCalVar, PCALENDAR_HEADER pCalCnt, FILE *pOutputFile);
int WriteCalendarVariableLength( PCALENDAR_HEADER pCalCnt, PCALENDAR_VARIABLE pCalVar, int *pTotalSize, FILE *pOutputFile);
int ConvertUnicodeToWord( WORD *pString, WORD *pValue);
//-------------------------------------------------------------------------//
// EXTERNAL ROUTINES //
//-------------------------------------------------------------------------//
////////////////////////////////////////////////////////////////////////////
//
// ParseWriteLocale
//
// This routine parses the input file for the locale specific tables, and
// then writes the data to the output file. This routine is only entered
// when the LOCALE keyword is found. The parsing continues until the
// ENDLOCALE keyword is found.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseWriteLocale( PLOCALE_HEADER pLocHdr, PLOCALE_STATIC pLocStat, PLOCALE_VARIABLE pLocVar, PSZ pszKeyWord) { int Num; // number of locales
int OffHdr; // file offset to header info
int OffLoc; // file offset to locale info
DWORD LocId; // locale id
FILE *pOutputFile; // ptr to output file
LOCALE_HEADER LocCnt; // locale character counts
CALENDAR_HEADER CalHdr; // calendar header structure
CALENDAR_VARIABLE CalVar; // calendar variable structure
//
// Get size parameter.
//
if (GetSize(&Num)) return (1);
//
// Set up initial file pointer offsets.
//
// OffHdr = header size
// OffLoc = header size + (Number of locales * header entry size)
//
OffHdr = LOC_CAL_HDR_WORDS; OffLoc = LOC_CAL_HDR_WORDS + (Num * LOCALE_HDR_WORDS);
//
// Initialize the output file and write the number of locales to
// the file. Also, in order to allow for the seek, write zeros
// in the file up to the first locale field.
//
if (WriteLocaleInit( &pOutputFile, Num, OffLoc )) { return (1); }
//
// Parse all of the locales one by one. Write each one to the file
// separately to conserve memory.
//
for (; Num > 0; Num--) { //
// Initialize all Locale structures each time.
//
memset(pLocHdr, 0, sizeof(LOCALE_HEADER)); memset(pLocStat, 0, sizeof(LOCALE_STATIC)); memset(pLocVar, 0, sizeof(LOCALE_VARIABLE)); memset(&LocCnt, 0, sizeof(LOCALE_HEADER));
//
// Get the BEGINLOCALE keyword and locale id.
//
if (fscanf( pInputFile, "%s %lx ;%*[^\n]", pszKeyWord, &LocId ) == 2) { if (_stricmp(pszKeyWord, "BEGINLOCALE") == 0) { if (Verbose) printf("\n\nFound BEGINLOCALE keyword, LocaleID = %x\n\n", LocId); } else { printf("Parse Error: Error reading BEGINLOCALE and Locale ID.\n"); fclose(pOutputFile); return (1); } } else { printf("Parse Error: Invalid Instruction '%s'.\n", pszKeyWord); printf(" Expecting BEGINLOCALE keyword and Locale ID.\n"); fclose(pOutputFile); return (1); }
//
// Parse the locale information.
//
if (ParseLocaleInfo( pLocHdr, pLocStat, pLocVar, &LocCnt, pszKeyWord )) { printf("Parse Error: Language == %ws.\n", pLocStat->szILanguage); fclose(pOutputFile); return (1); }
//
// Write the locale id, offset, and locale information to
// the output file.
//
if (WriteLocaleInfo( LocId, &OffHdr, &OffLoc, pLocHdr, pLocStat, pLocVar, &LocCnt, pOutputFile )) { printf("Write Error: Language == %ws.\n", pLocStat->szILanguage); fclose(pOutputFile); return (1); } }
//
// Look for ENDLOCALE keyword.
//
if (fscanf(pInputFile, "%s", pszKeyWord) == 1) { if (_stricmp(pszKeyWord, "ENDLOCALE") == 0) { if (Verbose) printf("\n\nFound ENDLOCALE keyword.\n"); } else { //
// The ENDLOCALE keyword was not found. Return failure.
//
printf("Parse Error: Expecting ENDLOCALE keyword.\n"); fclose(pOutputFile); return (1); } } else { //
// The ENDLOCALE keyword was not found. Return failure.
//
printf("Parse Error: Expecting ENDLOCALE keyword.\n"); fclose(pOutputFile); return (1); }
//
// Look for CALENDAR keyword.
//
if (fscanf(pInputFile, "%s", pszKeyWord) == 1) { if (_stricmp(pszKeyWord, "CALENDAR") == 0) { if (Verbose) printf("\n\nFound CALENDAR keyword.\n"); } else { //
// The CALENDAR keyword was not found. Return failure.
//
printf("Parse Error: Expecting CALENDAR keyword.\n"); fclose(pOutputFile); return (1); } } else { //
// The CALENDAR keyword was not found. Return failure.
//
printf("Parse Error: Expecting CALENDAR keyword.\n"); fclose(pOutputFile); return (1); }
//
// Get the valid keywords for CALENDAR.
// Write the CALENDAR information to an output file.
//
if (ParseWriteCalendar( &CalHdr, &CalVar, pszKeyWord, pOutputFile, OffLoc )) { fclose(pOutputFile); return (1); }
//
// Close the output file.
//
fclose(pOutputFile);
//
// Return success.
//
printf("\nSuccessfully wrote output file %s\n", LOCALE_FILE); return (0); }
//-------------------------------------------------------------------------//
// INTERNAL ROUTINES //
//-------------------------------------------------------------------------//
////////////////////////////////////////////////////////////////////////////
//
// ParseLocaleInfo
//
// This routine parses the locale information from the input file. If an
// error is encountered, a 1 is returned.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseLocaleInfo( PLOCALE_HEADER pLocHdr, PLOCALE_STATIC pLocStat, PLOCALE_VARIABLE pLocVar, PLOCALE_HEADER pLocCnt, PSZ pszKeyWord) { int Count; // number of characters written
WORD Tmp; // tmp place holder
//
// Read in the information associated with the language of a locale
// and store it in the locale structure.
//
if (!ParseLine( pszKeyWord, pLocStat->szILanguage, 5, TRUE )) { return (1); }
pLocHdr->SLanguage = (sizeof(LOCALE_HEADER) + sizeof(LOCALE_STATIC)) / sizeof(WORD); if (!(Count = ParseLine( pszKeyWord, pLocVar->szSLanguage, MAX, TRUE ))) { return (1); } pLocCnt->SLanguage = (WORD)Count;
pLocHdr->SAbbrevLang = pLocHdr->SLanguage + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevLang, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevLang = (WORD)Count;
pLocHdr->SAbbrevLangISO = pLocHdr->SAbbrevLang + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevLangISO, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevLangISO = (WORD)Count;
pLocHdr->SNativeLang = pLocHdr->SAbbrevLangISO + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSNativeLang, MAX, TRUE ))) { return (1); } pLocCnt->SNativeLang = (WORD)Count;
//
// Read in the information associated with the country of a locale
// and store it in the locale structure.
//
if (!ParseLine( pszKeyWord, pLocStat->szICountry, 6, TRUE )) { return (1); }
pLocHdr->SCountry = pLocHdr->SNativeLang + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSCountry, MAX, TRUE ))) { return (1); } pLocCnt->SCountry = (WORD)Count;
pLocHdr->SAbbrevCtry = pLocHdr->SCountry + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevCtry, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevCtry = (WORD)Count;
pLocHdr->SAbbrevCtryISO = pLocHdr->SAbbrevCtry + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevCtryISO, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevCtryISO = (WORD)Count;
pLocHdr->SNativeCtry = pLocHdr->SAbbrevCtryISO + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSNativeCtry, MAX, TRUE ))) { return (1); } pLocCnt->SNativeCtry = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szIGeoId, 8, TRUE )) { return (1); }
//
// Read in the default language, country, and code pages of a locale
// and store it in the locale structure.
//
if (!ParseLine( pszKeyWord, pLocStat->szIDefaultLang, 5, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIDefaultCtry, 6, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIDefaultACP, 6, TRUE )) { return (1); } if (!ConvertUnicodeToWord( pLocStat->szIDefaultACP, &(pLocStat->DefaultACP) )) { printf("Parse Error: Invalid IDEFAULTACP value %s\n", pLocStat->szIDefaultACP); return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIDefaultOCP, 6, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIDefaultMACCP, 6, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIDefaultEBCDICCP, 6, TRUE )) { return (1); }
//
// Read in the list separator, measurement info, and default paper size
// of a locale and store it in the locale structure.
//
pLocHdr->SList = pLocHdr->SNativeCtry + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSList, MAX, TRUE ))) { return (1); } pLocCnt->SList = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szIMeasure, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIPaperSize, 2, TRUE )) { return (1); }
//
// Read in the digits information of a locale and store it in the
// locale structure.
//
pLocHdr->SDecimal = pLocHdr->SList + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDecimal, MAX, TRUE ))) { return (1); } pLocCnt->SDecimal = (WORD)Count;
pLocHdr->SThousand = pLocHdr->SDecimal + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSThousand, MAX, TRUE ))) { return (1); } pLocCnt->SThousand = (WORD)Count;
pLocHdr->SGrouping = pLocHdr->SThousand + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSGrouping, MAX, TRUE ))) { return (1); } pLocCnt->SGrouping = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szIDigits, 3, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szILZero, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szINegNumber, 2, TRUE )) { return (1); }
pLocHdr->SNativeDigits = pLocHdr->SGrouping + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSNativeDigits, MAX, TRUE ))) { return (1); } pLocCnt->SNativeDigits = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szIDigitSubstitution, 2, TRUE )) { return (1); }
//
// Read in the monetary information of a locale and store it in the
// locale structure.
//
pLocHdr->SCurrency = pLocHdr->SNativeDigits + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSCurrency, MAX, TRUE ))) { return (1); } pLocCnt->SCurrency = (WORD)Count;
pLocHdr->SIntlSymbol = pLocHdr->SCurrency + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSIntlSymbol, MAX, TRUE ))) { return (1); } pLocCnt->SIntlSymbol = (WORD)Count;
pLocHdr->SEngCurrName = pLocHdr->SIntlSymbol + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSEngCurrName, MAX, TRUE ))) { return (1); } pLocCnt->SEngCurrName = (WORD)Count;
pLocHdr->SNativeCurrName = pLocHdr->SEngCurrName + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSNativeCurrName, MAX, TRUE ))) { return (1); } pLocCnt->SNativeCurrName = (WORD)Count;
pLocHdr->SMonDecSep = pLocHdr->SNativeCurrName + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonDecSep, MAX, TRUE ))) { return (1); } pLocCnt->SMonDecSep = (WORD)Count;
pLocHdr->SMonThousSep = pLocHdr->SMonDecSep + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonThousSep, MAX, TRUE ))) { return (1); } pLocCnt->SMonThousSep = (WORD)Count;
pLocHdr->SMonGrouping = pLocHdr->SMonThousSep + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonGrouping, MAX, TRUE ))) { return (1); } pLocCnt->SMonGrouping = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szICurrDigits, 3, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIIntlCurrDigits, 3, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szICurrency, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szINegCurr, 3, TRUE )) { return (1); }
//
// Read in the positive and negative sign information of a locale
// and store it in the locale structure.
//
pLocHdr->SPositiveSign = pLocHdr->SMonGrouping + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSPositiveSign, MAX, TRUE ))) { return (1); } pLocCnt->SPositiveSign = (WORD)Count;
pLocHdr->SNegativeSign = pLocHdr->SPositiveSign + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSNegativeSign, MAX, TRUE ))) { return (1); } pLocCnt->SNegativeSign = (WORD)Count;
//
// Read in the time information of a locale and store it
// in the locale structure.
//
pLocHdr->STimeFormat = pLocHdr->SNegativeSign + Count; if (!(Count = ParseMultiLine( pszKeyWord, pLocVar->szSTimeFormat, MAX ))) { return (1); } pLocCnt->STimeFormat = (WORD)Count;
pLocHdr->STime = pLocHdr->STimeFormat + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSTime, MAX, TRUE ))) { return (1); } pLocCnt->STime = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szITime, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szITLZero, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szITimeMarkPosn, 2, TRUE )) { return (1); }
pLocHdr->S1159 = pLocHdr->STime + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szS1159, MAX, TRUE ))) { return (1); } pLocCnt->S1159 = (WORD)Count;
pLocHdr->S2359 = pLocHdr->S1159 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szS2359, MAX, TRUE ))) { return (1); } pLocCnt->S2359 = (WORD)Count;
//
// Read in the short date information of a locale and store it
// in the locale structure.
//
pLocHdr->SShortDate = pLocHdr->S2359 + Count; if (!(Count = ParseMultiLine( pszKeyWord, pLocVar->szSShortDate, MAX ))) { return (1); } pLocCnt->SShortDate = (WORD)Count;
pLocHdr->SDate = pLocHdr->SShortDate + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDate, MAX, TRUE ))) { return (1); } pLocCnt->SDate = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szIDate, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szICentury, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIDayLZero, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIMonLZero, 2, TRUE )) { return (1); }
//
// Read in the long date information of a locale and store it
// in the locale structure.
//
pLocHdr->SYearMonth = pLocHdr->SDate + Count; if (!(Count = ParseMultiLine( pszKeyWord, pLocVar->szSYearMonth, MAX ))) { return (1); } pLocCnt->SYearMonth = (WORD)Count;
pLocHdr->SLongDate = pLocHdr->SYearMonth + Count; if (!(Count = ParseMultiLine( pszKeyWord, pLocVar->szSLongDate, MAX ))) { return (1); } pLocCnt->SLongDate = (WORD)Count;
if (!ParseLine( pszKeyWord, pLocStat->szILDate, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szICalendarType, 3, TRUE )) { return (1); }
pLocHdr->IOptionalCalendar = pLocHdr->SLongDate + Count; if (!(Count = ParseMultiLineSize( pszKeyWord, pLocVar->szIOptionalCalendar, MAX, &Tmp, OPT_CAL_FLAG ))) { return (1); } pLocCnt->IOptionalCalendar = (WORD)Count;
if (!ParseLine(pszKeyWord, pLocStat->szIFirstDayOfWeek, 2, TRUE )) { return (1); }
if (!ParseLine( pszKeyWord, pLocStat->szIFirstWeekOfYear, 2, TRUE )) { return (1); }
//
// Read in the day information of a locale and store it in the
// locale structure.
//
pLocHdr->SDayName1 = pLocHdr->IOptionalCalendar + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName1, MAX, TRUE ))) { return (1); } pLocCnt->SDayName1 = (WORD)Count;
pLocHdr->SDayName2 = pLocHdr->SDayName1 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName2, MAX, TRUE ))) { return (1); } pLocCnt->SDayName2 = (WORD)Count;
pLocHdr->SDayName3 = pLocHdr->SDayName2 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName3, MAX, TRUE ))) { return (1); } pLocCnt->SDayName3 = (WORD)Count;
pLocHdr->SDayName4 = pLocHdr->SDayName3 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName4, MAX, TRUE ))) { return (1); } pLocCnt->SDayName4 = (WORD)Count;
pLocHdr->SDayName5 = pLocHdr->SDayName4 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName5, MAX, TRUE ))) { return (1); } pLocCnt->SDayName5 = (WORD)Count;
pLocHdr->SDayName6 = pLocHdr->SDayName5 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName6, MAX, TRUE ))) { return (1); } pLocCnt->SDayName6 = (WORD)Count;
pLocHdr->SDayName7 = pLocHdr->SDayName6 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSDayName7, MAX, TRUE ))) { return (1); } pLocCnt->SDayName7 = (WORD)Count;
pLocHdr->SAbbrevDayName1 = pLocHdr->SDayName7 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName1, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName1 = (WORD)Count;
pLocHdr->SAbbrevDayName2 = pLocHdr->SAbbrevDayName1 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName2, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName2 = (WORD)Count;
pLocHdr->SAbbrevDayName3 = pLocHdr->SAbbrevDayName2 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName3, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName3 = (WORD)Count;
pLocHdr->SAbbrevDayName4 = pLocHdr->SAbbrevDayName3 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName4, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName4 = (WORD)Count;
pLocHdr->SAbbrevDayName5 = pLocHdr->SAbbrevDayName4 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName5, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName5 = (WORD)Count;
pLocHdr->SAbbrevDayName6 = pLocHdr->SAbbrevDayName5 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName6, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName6 = (WORD)Count;
pLocHdr->SAbbrevDayName7 = pLocHdr->SAbbrevDayName6 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevDayName7, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevDayName7 = (WORD)Count;
//
// Read in the month information of a locale and store it in the
// locale structure.
//
pLocHdr->SMonthName1 = pLocHdr->SAbbrevDayName7 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName1, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName1 = (WORD)Count;
pLocHdr->SMonthName2 = pLocHdr->SMonthName1 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName2, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName2 = (WORD)Count;
pLocHdr->SMonthName3 = pLocHdr->SMonthName2 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName3, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName3 = (WORD)Count;
pLocHdr->SMonthName4 = pLocHdr->SMonthName3 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName4, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName4 = (WORD)Count;
pLocHdr->SMonthName5 = pLocHdr->SMonthName4 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName5, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName5 = (WORD)Count;
pLocHdr->SMonthName6 = pLocHdr->SMonthName5 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName6, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName6 = (WORD)Count;
pLocHdr->SMonthName7 = pLocHdr->SMonthName6 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName7, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName7 = (WORD)Count;
pLocHdr->SMonthName8 = pLocHdr->SMonthName7 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName8, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName8 = (WORD)Count;
pLocHdr->SMonthName9 = pLocHdr->SMonthName8 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName9, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName9 = (WORD)Count;
pLocHdr->SMonthName10 = pLocHdr->SMonthName9 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName10, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName10 = (WORD)Count;
pLocHdr->SMonthName11 = pLocHdr->SMonthName10 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName11, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName11 = (WORD)Count;
pLocHdr->SMonthName12 = pLocHdr->SMonthName11 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName12, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName12 = (WORD)Count;
pLocHdr->SMonthName13 = pLocHdr->SMonthName12 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSMonthName13, MAX, TRUE ))) { return (1); } pLocCnt->SMonthName13 = (WORD)Count;
pLocHdr->SAbbrevMonthName1 = pLocHdr->SMonthName13 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName1, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName1 = (WORD)Count;
pLocHdr->SAbbrevMonthName2 = pLocHdr->SAbbrevMonthName1 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName2, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName2 = (WORD)Count;
pLocHdr->SAbbrevMonthName3 = pLocHdr->SAbbrevMonthName2 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName3, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName3 = (WORD)Count;
pLocHdr->SAbbrevMonthName4 = pLocHdr->SAbbrevMonthName3 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName4, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName4 = (WORD)Count;
pLocHdr->SAbbrevMonthName5 = pLocHdr->SAbbrevMonthName4 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName5, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName5 = (WORD)Count;
pLocHdr->SAbbrevMonthName6 = pLocHdr->SAbbrevMonthName5 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName6, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName6 = (WORD)Count;
pLocHdr->SAbbrevMonthName7 = pLocHdr->SAbbrevMonthName6 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName7, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName7 = (WORD)Count;
pLocHdr->SAbbrevMonthName8 = pLocHdr->SAbbrevMonthName7 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName8, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName8 = (WORD)Count;
pLocHdr->SAbbrevMonthName9 = pLocHdr->SAbbrevMonthName8 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName9, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName9 = (WORD)Count;
pLocHdr->SAbbrevMonthName10 = pLocHdr->SAbbrevMonthName9 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName10, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName10 = (WORD)Count;
pLocHdr->SAbbrevMonthName11 = pLocHdr->SAbbrevMonthName10 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName11, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName11 = (WORD)Count;
pLocHdr->SAbbrevMonthName12 = pLocHdr->SAbbrevMonthName11 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName12, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName12 = (WORD)Count;
pLocHdr->SAbbrevMonthName13 = pLocHdr->SAbbrevMonthName12 + Count; if (!(Count = ParseLine( pszKeyWord, pLocVar->szSAbbrevMonthName13, MAX, TRUE ))) { return (1); } pLocCnt->SAbbrevMonthName13 = (WORD)Count;
pLocHdr->SEndOfLocale = pLocHdr->SAbbrevMonthName13 + Count;
//
// Read in the font signature information of a locale and store it in
// the locale structure.
//
// NOTE: Don't want the null terminator on this string, so tell
// the parse routine that there is one more space in the buffer.
// This works because the buffer is filled with 0 initially, so
// no null terminator is added onto the end of the string.
// Instead, it will simply fill in the buffer with the
// MAX_FONTSIGNATURE amount of values.
//
if (!ParseLine( pszKeyWord, pLocStat->szFontSignature, MAX_FONTSIGNATURE + 1, // don't want null term
FALSE )) { return (1); }
//
// Get szIPosSymPrecedes and szIPosSepBySpace from the szICurrency
// value.
//
// NOTE: All buffers initialized to 0, so no need to zero terminate.
//
switch (*(pLocStat->szICurrency)) { case ( '0' ) : { *(pLocStat->szIPosSymPrecedes) = L'1'; *(pLocStat->szIPosSepBySpace) = L'0'; break; }
case ( '1' ) : { *(pLocStat->szIPosSymPrecedes) = L'0'; *(pLocStat->szIPosSepBySpace) = L'0'; break; }
case ( '2' ) : { *(pLocStat->szIPosSymPrecedes) = L'1'; *(pLocStat->szIPosSepBySpace) = L'1'; break; }
case ( '3' ) : { *(pLocStat->szIPosSymPrecedes) = L'0'; *(pLocStat->szIPosSepBySpace) = L'1'; break; }
default : { printf("Parse Error: Invalid ICURRENCY value.\n"); return (1); } }
//
// Get szIPosSignPosn, szINegSignPosn, szINegSymPrecedes, and
// szINegSepBySpace from the szINegCurr value.
//
// NOTE: All buffers initialized to 0, so no need to zero terminate.
//
switch (*(pLocStat->szINegCurr)) { case ( '0' ) : { *(pLocStat->szIPosSignPosn) = L'3'; *(pLocStat->szINegSignPosn) = L'0'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '1' ) : { switch (*((pLocStat->szINegCurr) + 1)) { case ( 0 ) : { *(pLocStat->szIPosSignPosn) = L'3'; *(pLocStat->szINegSignPosn) = L'3'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'0'; break; } case ( '0' ) : { *(pLocStat->szIPosSignPosn) = L'4'; *(pLocStat->szINegSignPosn) = L'4'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'1'; break; } case ( '1' ) : { *(pLocStat->szIPosSignPosn) = L'2'; *(pLocStat->szINegSignPosn) = L'2'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'1'; break; } case ( '2' ) : { *(pLocStat->szIPosSignPosn) = L'4'; *(pLocStat->szINegSignPosn) = L'4'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'1'; break; } case ( '3' ) : { *(pLocStat->szIPosSignPosn) = L'3'; *(pLocStat->szINegSignPosn) = L'3'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'1'; break; } case ( '4' ) : { *(pLocStat->szIPosSignPosn) = L'3'; *(pLocStat->szINegSignPosn) = L'0'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'1'; break; } case ( '5' ) : { *(pLocStat->szIPosSignPosn) = L'1'; *(pLocStat->szINegSignPosn) = L'0'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'1'; break; } default : { printf("Parse Error: Invalid INEGCURR value.\n"); return (1); } }
break; }
case ( '2' ) : { *(pLocStat->szIPosSignPosn) = L'4'; *(pLocStat->szINegSignPosn) = L'4'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '3' ) : { *(pLocStat->szIPosSignPosn) = L'2'; *(pLocStat->szINegSignPosn) = L'2'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '4' ) : { *(pLocStat->szIPosSignPosn) = L'1'; *(pLocStat->szINegSignPosn) = L'0'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '5' ) : { *(pLocStat->szIPosSignPosn) = L'1'; *(pLocStat->szINegSignPosn) = L'1'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '6' ) : { *(pLocStat->szIPosSignPosn) = L'3'; *(pLocStat->szINegSignPosn) = L'3'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '7' ) : { *(pLocStat->szIPosSignPosn) = L'4'; *(pLocStat->szINegSignPosn) = L'4'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'0'; break; }
case ( '8' ) : { *(pLocStat->szIPosSignPosn) = L'1'; *(pLocStat->szINegSignPosn) = L'1'; *(pLocStat->szINegSymPrecedes) = L'0'; *(pLocStat->szINegSepBySpace) = L'1'; break; }
case ( '9' ) : { *(pLocStat->szIPosSignPosn) = L'3'; *(pLocStat->szINegSignPosn) = L'3'; *(pLocStat->szINegSymPrecedes) = L'1'; *(pLocStat->szINegSepBySpace) = L'1'; break; }
default : { printf("Parse Error: Invalid INEGCURR value.\n"); return (1); } }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// ParseLine
//
// This routine parses one line of the input file. This routine is only
// called to parse a line within the LOCALE keyword section.
// Returns the number of characters written to the buffer (0 means error).
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseLine( PSZ pszLine, WORD *pInfo, int BufSize, BOOL fConvert) { int Num = 0; // number of strings read in
BYTE pszKey[MAX]; // keyword - ignored
//
// Get to next line of information.
// If no more strings could be read in, return an error.
//
if (fscanf(pInputFile, "%s", pszKey) == 0) { printf("Parse Error: Incomplete LOCALE information.\n"); return (0); }
//
// Read in the rest of the line.
//
if (fgets(pszLine, MAX, pInputFile) == NULL) { *pInfo = 0; return (1); }
//
// Return the count of characters put in the buffer.
//
return (ScanBuffer( pszLine, pInfo, BufSize, pszKey, fConvert )); }
////////////////////////////////////////////////////////////////////////////
//
// ParseMultiLine
//
// This routine parses multiple lines of the input file. This routine is only
// called to parse a set of lines within the LOCALE keyword section.
// Returns the number of characters written to the buffer (0 means error).
// This should only be called to parse multiple lines for ONE locale item.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseMultiLine( PSZ pszLine, WORD *pInfo, int BufSize) { int Num = 0; // number of strings read in
BYTE pszKey[MAX]; // keyword - ignored
int Count = 0; // count of characters
int TmpCt; // ScanBuffer return count
WORD *pInfoPtr; // tmp ptr to pInfo buffer
//
// Get to next line of information.
// If no more strings could be read in, return an error.
//
if (fscanf(pInputFile, "%s", pszKey) == 0) { printf("Parse Error: Incomplete LOCALE information.\n"); return (0); }
//
// Get size parameter.
//
if (GetLocaleInfoSize(&Num)) { return (0); }
//
// Check for num == 0.
//
if (Num == 0) { *pInfo = 0; return (1); }
//
// Read in the appropriate number of lines.
//
pInfoPtr = pInfo; while (Num > 0) { //
// Read in the rest of the line. If nothing on the current line,
// go to the next line and try again.
//
if (fgets(pszLine, MAX, pInputFile) != NULL) { TmpCt = ScanBuffer( pszLine, pInfoPtr, BufSize - Count, pszKey, TRUE ); Num--; pInfoPtr += TmpCt; Count += TmpCt; } }
//
// Return the count of characters put in the buffer.
//
return (Count); }
////////////////////////////////////////////////////////////////////////////
//
// ParseMultiLineSize
//
// This routine parses the IOPTIONALCALENDAR line and the SERARANGES line
// of the calendar input file. It stores the value as both a WORD and a
// string. It also stores the size of the information read in, including
// the 2 words for the value and the size.
//
// Returns the number of characters written to the buffer (0 means error).
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseMultiLineSize( PSZ pszLine, WORD *pInfo, int BufSize, WORD *pNum, int Flag) { int Num = 0; // number of strings read in
BYTE pszKey[MAX]; // keyword - ignored
int Count = 0; // count of characters
int TmpCt; // ScanBuffer return count
int Value; // value for sscanf
WORD *pInfoPtr; // tmp ptr to pInfo buffer
int Incr; // increment amount for buffer
//
// Get to next line of information.
// If no more strings could be read in, return an error.
//
if (fscanf(pInputFile, "%s", pszKey) == 0) { printf("Parse Error: Incomplete LOCALE information.\n"); return (0); }
//
// Get size parameter.
//
if (GetLocaleInfoSize(&Num)) { return (0); }
//
// Save the number of ranges.
//
*pNum = (WORD)Num;
//
// Check for num == 0.
//
if (Num == 0) { *pInfo = 0; return (1); }
//
// Set the increment amount based on the Flag parameter.
//
Incr = (Flag == ERA_RANGE_FLAG) ? 4 : 2;
//
// Read in the appropriate number of lines.
//
pInfoPtr = pInfo; while (Num > 0) { //
// If we're getting the era ranges, then we need to read in the
// month and day of the era before we read in the year.
//
// Ordering in Buffer:
// Month, Day, Year, Offset, Year String, Era Name String
//
if (Flag == ERA_RANGE_FLAG) { //
// Get the Month.
//
if (GetLocaleInfoSize(&Value)) { return (0); } pInfoPtr[0] = (WORD)Value;
//
// Get the Day.
//
if (GetLocaleInfoSize(&Value)) { return (0); } pInfoPtr[1] = (WORD)Value; }
//
// Read in the rest of the line. If nothing on the current line,
// go to the next line and try again.
//
if (fgets(pszLine, MAX, pInputFile) != NULL) { TmpCt = ScanBuffer( pszLine, pInfoPtr + Incr, BufSize - Count - Incr, pszKey, TRUE );
TmpCt += Incr;
swscanf(pInfoPtr + Incr, L"%d", &Value); pInfoPtr[Incr - 2] = (WORD)Value; pInfoPtr[Incr - 1] = (WORD)TmpCt;
Num--; pInfoPtr += TmpCt; Count += TmpCt; } }
//
// Return the count of characters put in the buffer.
//
return (Count); }
////////////////////////////////////////////////////////////////////////////
//
// GetLocaleInfoSize
//
// This routine gets the size of the table from the input file. If the
// size is not there, then an error is returned.
//
// 07-30-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int GetLocaleInfoSize( int *pSize) { int NumItems; // number of items returned from fscanf
//
// Read the size from the input file.
//
NumItems = fscanf(pInputFile, "%d", pSize); if (NumItems != 1) { printf("Parse Error: Error reading size value.\n"); return (1); }
if (*pSize < 0) { printf("Parse Error: Invalid size value %d\n", *pSize); return (1); }
if (Verbose) printf(" SIZE = %d\n", *pSize);
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// ScanBuffer
//
// This routine converts the given ansi buffer to a wide character buffer,
// removes leading and trailing white space, and then scans it for escape
// characters. The final buffer and the number of characters written to
// the buffer (0 means error) are returned.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ScanBuffer( PSZ pszLine, WORD *pInfo, int BufSize, BYTE *pszKey, BOOL fConvert) { int Num = 0; // number of strings read in
WORD pwszTemp[MAX]; // first string of information
WORD *pwszInfoPtr; // ptr to string of information to store
int Count = 0; // count of characters
//
// Convert the ansi buffer to a wide char buffer and skip over any
// leading white space.
//
if (sscanf(pszLine, "%*[\t ]%255w[^\n]", pwszTemp) == 0) { //
// This should only happen if there is only white space on the line.
//
*pInfo = 0; return (1); }
//
// Remove trailing spaces.
//
// NOTE: Subtract 1 from the end of the string to skip over the
// null terminator. The line feed was already filtered out above.
//
pwszInfoPtr = pwszTemp + wcslen(pwszTemp) - 1; while ((pwszInfoPtr != pwszTemp) && ((*pwszInfoPtr == L' ') || (*pwszInfoPtr == L'\t'))) { pwszInfoPtr--; } *(pwszInfoPtr + 1) = 0;
if (Verbose) printf(" %s\t%ws\n", pszKey, pwszTemp);
//
// Buffer should be initialized to zero, so no need to
// zero terminate the string.
//
pwszInfoPtr = pwszTemp; while ((*pwszInfoPtr != L'\n') && (*pwszInfoPtr != 0)) { //
// Check output buffer size.
//
if (Count >= (BufSize - 1)) { printf("WARNING: String is too long - truncating %s\n", pszKey); break; }
//
// Check for escape sequence.
//
if (*pwszInfoPtr == L'\\') { pwszInfoPtr++;
if ((*pwszInfoPtr == L'x') || (*pwszInfoPtr == L'X')) { //
// Read in hex value.
//
// NOTE: All hex values MUST be 4 digits long -
// character may be ignored or hex values may be
// incorrect.
//
if (swscanf(pwszInfoPtr + 1, L"%4x", &Num) != 1) { printf("Parse Error: No number following \\x for %s.\n", pszKey); return (0); }
//
// Check for special character - 0xffff. Change it to a
// null terminator.
// This means that there is more than one string for one
// LCTYPE information.
//
if ((fConvert) && (Num == 0xffff)) { *pInfo = (WORD)0; } else { *pInfo = (WORD)Num; } pInfo++; pwszInfoPtr += 5; Count++; } else if (*pwszInfoPtr == L'\\') { //
// Want to print out backslash, so do it.
//
*pInfo = *pwszInfoPtr; pInfo++; pwszInfoPtr++; Count++; } else { //
// Escape character not followed by valid character.
//
printf("Parse Error: Invalid escape sequence for %s.\n", pszKey); return (0); } } else { //
// Simply copy character. No special casing required.
//
*pInfo = *pwszInfoPtr; pInfo++; pwszInfoPtr++; Count++; } }
//
// Return the count of characters put in the buffer.
//
return (Count + 1); }
////////////////////////////////////////////////////////////////////////////
//
// WriteLocaleInit
//
// This routine opens the output file for writing and writes the number
// of locales as the first piece of data to the file.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int WriteLocaleInit( FILE **ppOutputFile, int NumLoc, int OffLoc) { WORD pDummy[MAX]; // dummy storage
DWORD dwValue; // temp storage value
//
// Make sure output file can be opened for writing.
//
if ((*ppOutputFile = fopen(LOCALE_FILE, "w+b")) == 0) { printf("Error opening output file %s.\n", LOCALE_FILE); return (1); }
if (Verbose) printf("\n\nWriting output file %s...\n", LOCALE_FILE);
//
// Write the number of locales to the file.
//
dwValue = (DWORD)NumLoc; if (FileWrite( *ppOutputFile, &dwValue, sizeof(DWORD), 1, "Number of Locales" )) { fclose(*ppOutputFile); return (1); }
//
// Write zeros in the file to allow the seek to work.
//
memset(pDummy, 0, MAX * sizeof(WORD)); if (FileWrite( *ppOutputFile, pDummy, sizeof(WORD), OffLoc, "Locale File Header" )) { fclose(*ppOutputFile); return (1); }
//
// Seek back to the beginning of the locale header.
//
if (fseek( *ppOutputFile, LOC_CAL_HDR_WORDS * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// WriteLocaleInfo
//
// This routine writes the locale id, offset, and locale information to
// the output file. It needs to seek ahead to the correct position for the
// locale information, and then seeks back to the header position. The
// file positions are updated to reflect the next offsets.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int WriteLocaleInfo( DWORD Locale, int *pOffHdr, int *pOffLoc, PLOCALE_HEADER pLocHdr, PLOCALE_STATIC pLocStat, PLOCALE_VARIABLE pLocVar, PLOCALE_HEADER pLocCnt, FILE *pOutputFile) { int Size; // size of locale information
int TotalSize = 0; // total size of the locale information
DWORD dwValue; // temp storage value
if (Verbose) printf("\nWriting Locale Information for %x...\n", Locale);
//
// Write the locale id and offset to the locale information in
// the header area of the output file.
//
dwValue = (DWORD)(*pOffLoc); if (FileWrite( pOutputFile, &Locale, sizeof(DWORD), 1, "Locale ID" ) || FileWrite( pOutputFile, &dwValue, sizeof(DWORD), 1, "Locale Info Offset" )) { return (1); }
//
// Seek forward to locale info offset.
//
if (fseek( pOutputFile, (*pOffLoc) * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Write the locale information to the output file.
// Header Info
// Static Length Info
// Variable Length Info
//
TotalSize = Size = sizeof(LOCALE_HEADER) / sizeof(WORD); if (FileWrite( pOutputFile, pLocHdr, sizeof(WORD), Size, "Locale Header" )) { return (1); }
TotalSize += (Size = sizeof(LOCALE_STATIC) / sizeof(WORD)); if (FileWrite( pOutputFile, pLocStat, sizeof(WORD), Size, "Locale Static Info" )) { return (1); }
if (WriteVariableLength( pLocCnt, pLocVar, &TotalSize, pOutputFile )) { return (1); }
//
// Set the offsets to their new values.
//
Size = *pOffLoc; (*pOffHdr) += LOCALE_HDR_WORDS; (*pOffLoc) += TotalSize;
//
// Make sure the size is not wrapping - can't be greater than
// a DWORD.
//
if (Size > *pOffLoc) { printf("Size Error: Offset is greater than a DWORD for locale %x.\n", Locale); return (1); }
//
// Seek back to the header offset.
//
if (fseek( pOutputFile, (*pOffHdr) * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// WriteVariableLength
//
// This routine writes the variable length locale information to the output
// file. It adds on to the total size of the locale information as it adds
// the variable length information.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int WriteVariableLength( PLOCALE_HEADER pLocCnt, PLOCALE_VARIABLE pLocVar, int *pTotalSize, FILE *pOutputFile) { int Size; // size of string
*pTotalSize += (Size = pLocCnt->SLanguage); if (FileWrite( pOutputFile, pLocVar->szSLanguage, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevLang); if (FileWrite( pOutputFile, pLocVar->szSAbbrevLang, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevLangISO); if (FileWrite( pOutputFile, pLocVar->szSAbbrevLangISO, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SNativeLang); if (FileWrite( pOutputFile, pLocVar->szSNativeLang, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SCountry); if (FileWrite( pOutputFile, pLocVar->szSCountry, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevCtry); if (FileWrite( pOutputFile, pLocVar->szSAbbrevCtry, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevCtryISO); if (FileWrite( pOutputFile, pLocVar->szSAbbrevCtryISO, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SNativeCtry); if (FileWrite( pOutputFile, pLocVar->szSNativeCtry, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SList); if (FileWrite( pOutputFile, pLocVar->szSList, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDecimal); if (FileWrite( pOutputFile, pLocVar->szSDecimal, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SThousand); if (FileWrite( pOutputFile, pLocVar->szSThousand, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SGrouping); if (FileWrite( pOutputFile, pLocVar->szSGrouping, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SNativeDigits); if (FileWrite( pOutputFile, pLocVar->szSNativeDigits, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SCurrency); if (FileWrite( pOutputFile, pLocVar->szSCurrency, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SIntlSymbol); if (FileWrite( pOutputFile, pLocVar->szSIntlSymbol, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SEngCurrName); if (FileWrite( pOutputFile, pLocVar->szSEngCurrName, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SNativeCurrName); if (FileWrite( pOutputFile, pLocVar->szSNativeCurrName, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonDecSep); if (FileWrite( pOutputFile, pLocVar->szSMonDecSep, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonThousSep); if (FileWrite( pOutputFile, pLocVar->szSMonThousSep, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonGrouping); if (FileWrite( pOutputFile, pLocVar->szSMonGrouping, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SPositiveSign); if (FileWrite( pOutputFile, pLocVar->szSPositiveSign, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SNegativeSign); if (FileWrite( pOutputFile, pLocVar->szSNegativeSign, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->STimeFormat); if (FileWrite( pOutputFile, pLocVar->szSTimeFormat, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->STime); if (FileWrite( pOutputFile, pLocVar->szSTime, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->S1159); if (FileWrite( pOutputFile, pLocVar->szS1159, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->S2359); if (FileWrite( pOutputFile, pLocVar->szS2359, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SShortDate); if (FileWrite( pOutputFile, pLocVar->szSShortDate, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDate); if (FileWrite( pOutputFile, pLocVar->szSDate, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SYearMonth); if (FileWrite( pOutputFile, pLocVar->szSYearMonth, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SLongDate); if (FileWrite( pOutputFile, pLocVar->szSLongDate, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->IOptionalCalendar); if (FileWrite( pOutputFile, pLocVar->szIOptionalCalendar, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName1); if (FileWrite( pOutputFile, pLocVar->szSDayName1, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName2); if (FileWrite( pOutputFile, pLocVar->szSDayName2, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName3); if (FileWrite( pOutputFile, pLocVar->szSDayName3, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName4); if (FileWrite( pOutputFile, pLocVar->szSDayName4, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName5); if (FileWrite( pOutputFile, pLocVar->szSDayName5, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName6); if (FileWrite( pOutputFile, pLocVar->szSDayName6, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SDayName7); if (FileWrite( pOutputFile, pLocVar->szSDayName7, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName1); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName1, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName2); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName2, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName3); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName3, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName4); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName4, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName5); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName5, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName6); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName6, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevDayName7); if (FileWrite( pOutputFile, pLocVar->szSAbbrevDayName7, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName1); if (FileWrite( pOutputFile, pLocVar->szSMonthName1, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName2); if (FileWrite( pOutputFile, pLocVar->szSMonthName2, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName3); if (FileWrite( pOutputFile, pLocVar->szSMonthName3, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName4); if (FileWrite( pOutputFile, pLocVar->szSMonthName4, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName5); if (FileWrite( pOutputFile, pLocVar->szSMonthName5, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName6); if (FileWrite( pOutputFile, pLocVar->szSMonthName6, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName7); if (FileWrite( pOutputFile, pLocVar->szSMonthName7, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName8); if (FileWrite( pOutputFile, pLocVar->szSMonthName8, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName9); if (FileWrite( pOutputFile, pLocVar->szSMonthName9, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName10); if (FileWrite( pOutputFile, pLocVar->szSMonthName10, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName11); if (FileWrite( pOutputFile, pLocVar->szSMonthName11, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName12); if (FileWrite( pOutputFile, pLocVar->szSMonthName12, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SMonthName13); if (FileWrite( pOutputFile, pLocVar->szSMonthName13, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName1); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName1, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName2); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName2, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName3); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName3, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName4); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName4, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName5); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName5, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName6); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName6, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName7); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName7, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName8); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName8, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName9); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName9, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName10); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName10, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName11); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName11, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName12); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName12, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
*pTotalSize += (Size = pLocCnt->SAbbrevMonthName13); if (FileWrite( pOutputFile, pLocVar->szSAbbrevMonthName13, sizeof(WORD), Size, "Locale Variable Info" )) { return (1); }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// ParseWriteCalendar
//
// This routine parses the input file for the calendar specific tables, and
// then writes the data to the output file. This routine is only entered
// when the CALENDAR keyword is found. The parsing continues until the
// ENDCALENDAR keyword is found.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseWriteCalendar( PCALENDAR_HEADER pCalHdr, PCALENDAR_VARIABLE pCalVar, PSZ pszKeyWord, FILE *pOutputFile, int OffHdr) { int Num; // number of calendars
int OffCal; // file offset to calendar info
int OffCalBegin; // file offset to beginning of calendar info
DWORD CalId; // calendar id
CALENDAR_HEADER CalCnt; // calendar character counts
//
// Get size parameter.
//
if (GetSize(&Num)) return (1);
//
// Set up initial file pointer offsets.
//
// OffCal = (Number of calendars * header entry size)
//
OffCalBegin = OffHdr; OffCal = Num * CALENDAR_HDR_WORDS;
//
// Initialize the output file and write the number of calendars to
// the file. Also, in order to allow for the seek, write zeros
// in the file up to the first calendar field.
//
if (WriteCalendarInit( pOutputFile, Num, OffHdr )) { return (1); }
//
// Parse all of the calendars one by one. Write each one to the file
// separately to conserve memory.
//
for (; Num > 0; Num--) { //
// Initialize all Calendar structures each time.
//
memset(pCalHdr, 0, sizeof(CALENDAR_HEADER)); memset(pCalVar, 0, sizeof(CALENDAR_VARIABLE)); memset(&CalCnt, 0, sizeof(CALENDAR_HEADER));
//
// Get the BEGINCALENDAR keyword and calendar id.
//
if (fscanf( pInputFile, "%s %ld ;%*[^\n]", pszKeyWord, &CalId ) == 2) { if (_stricmp(pszKeyWord, "BEGINCALENDAR") == 0) { if (Verbose) printf("\n\nFound BEGINCALENDAR keyword, CalendarID = %d\n\n", CalId); } else { printf("Parse Error: Error reading BEGINCALENDAR and Calendar ID.\n"); return (1); } } else { printf("Parse Error: Invalid Instruction '%s'.\n", pszKeyWord); printf(" Expecting BEGINCALENDAR keyword and Calendar ID.\n"); return (1); }
//
// Parse the calendar information.
//
if (ParseCalendarInfo( pCalHdr, pCalVar, &CalCnt, pszKeyWord )) { printf("Parse Error: Calendar == %d.\n", CalId); return (1); }
//
// Write the calendar id, offset, and calendar information to
// the output file.
//
if (WriteCalendarInfo( CalId, &OffHdr, &OffCal, OffCalBegin, pCalHdr, pCalVar, &CalCnt, pOutputFile )) { printf("Write Error: Calendar == %d.\n", CalId); return (1); } }
//
// Look for ENDCALENDAR keyword.
//
if (fscanf(pInputFile, "%s", pszKeyWord) == 1) { if (_stricmp(pszKeyWord, "ENDCALENDAR") == 0) { if (Verbose) printf("\n\nFound ENDCALENDAR keyword.\n");
//
// Return success.
//
return (0); } }
//
// If this point is reached, then the ENDCALENDAR keyword was not
// found. Return failure.
//
printf("Parse Error: Expecting ENDCALENDAR keyword.\n"); return (1); }
////////////////////////////////////////////////////////////////////////////
//
// ParseCalendarInfo
//
// This routine parses the calendar information from the input file. If an
// error is encountered, a 1 is returned.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int ParseCalendarInfo( PCALENDAR_HEADER pCalHdr, PCALENDAR_VARIABLE pCalVar, PCALENDAR_HEADER pCalCnt, PSZ pszKeyWord) { int Count; // number of characters written
int Value; // hex value returned
//
// Read in the calendar id and store it in the calendar structure.
//
pCalHdr->SCalendar = sizeof(CALENDAR_HEADER) / sizeof(WORD); if (!(Count = ParseLine( pszKeyWord, pCalVar->szSCalendar, MAX, TRUE ))) { return (1); } pCalCnt->SCalendar = (WORD)Count;
//
// Read in the two digit year max and store it in the calendar
// structure.
//
pCalHdr->STwoDigitYearMax = pCalHdr->SCalendar + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSTwoDigitYearMax, MAX, TRUE ))) { return (1); } pCalCnt->STwoDigitYearMax = (WORD)Count;
//
// Read in the range offsets and store them in the calendar structure.
//
pCalHdr->SEraRanges = pCalHdr->STwoDigitYearMax + Count; if (!(Count = ParseMultiLineSize( pszKeyWord, pCalVar->szSEraRanges, MAX, &(pCalHdr->NumRanges), ERA_RANGE_FLAG ))) { return (1); } pCalCnt->SEraRanges = (WORD)Count; pCalCnt->NumRanges = pCalHdr->NumRanges;
//
// Read in the short date information and store it in the
// calendar structure.
//
pCalHdr->SShortDate = pCalHdr->SEraRanges + Count; if (!(Count = ParseMultiLine( pszKeyWord, pCalVar->szSShortDate, MAX ))) { return (1); } pCalCnt->SShortDate = (WORD)Count;
//
// Read in the year month information and store it in the
// calendar structure.
//
pCalHdr->SYearMonth = pCalHdr->SShortDate + Count; if (!(Count = ParseMultiLine( pszKeyWord, pCalVar->szSYearMonth, MAX ))) { return (1); } pCalCnt->SYearMonth = (WORD)Count;
//
// Read in the long date information and store it in the
// calendar structure.
//
pCalHdr->SLongDate = pCalHdr->SYearMonth + Count; if (!(Count = ParseMultiLine( pszKeyWord, pCalVar->szSLongDate, MAX ))) { return (1); } pCalCnt->SLongDate = (WORD)Count;
pCalHdr->SDayName1 = pCalHdr->SLongDate + Count;
//
// See if any day or month names exist.
//
if (fscanf(pInputFile, "%s", pszKeyWord) != 1) { printf("Parse Error: Error reading ERA keyword.\n"); return (1); } if (GetLocaleInfoSize(&Value)) return (1);
pCalHdr->IfNames = (WORD)Value; pCalCnt->IfNames = (WORD)Value; if (!Value) { pCalHdr->SCalendar -= CAL_NAME_HDR_SIZE; pCalHdr->STwoDigitYearMax -= CAL_NAME_HDR_SIZE; pCalHdr->SEraRanges -= CAL_NAME_HDR_SIZE; pCalHdr->SShortDate -= CAL_NAME_HDR_SIZE; pCalHdr->SYearMonth -= CAL_NAME_HDR_SIZE; pCalHdr->SLongDate -= CAL_NAME_HDR_SIZE; pCalHdr->SDayName1 -= CAL_NAME_HDR_SIZE;
//
// Return success. Don't read any more values for this
// calendar.
//
return (0); }
//
// Read in the day information and store it in the
// calendar structure.
//
pCalHdr->SDayName1 = pCalHdr->SLongDate + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName1, MAX, TRUE ))) { return (1); } pCalCnt->SDayName1 = (WORD)Count;
pCalHdr->SDayName2 = pCalHdr->SDayName1 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName2, MAX, TRUE ))) { return (1); } pCalCnt->SDayName2 = (WORD)Count;
pCalHdr->SDayName3 = pCalHdr->SDayName2 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName3, MAX, TRUE ))) { return (1); } pCalCnt->SDayName3 = (WORD)Count;
pCalHdr->SDayName4 = pCalHdr->SDayName3 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName4, MAX, TRUE ))) { return (1); } pCalCnt->SDayName4 = (WORD)Count;
pCalHdr->SDayName5 = pCalHdr->SDayName4 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName5, MAX, TRUE ))) { return (1); } pCalCnt->SDayName5 = (WORD)Count;
pCalHdr->SDayName6 = pCalHdr->SDayName5 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName6, MAX, TRUE ))) { return (1); } pCalCnt->SDayName6 = (WORD)Count;
pCalHdr->SDayName7 = pCalHdr->SDayName6 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSDayName7, MAX, TRUE ))) { return (1); } pCalCnt->SDayName7 = (WORD)Count;
pCalHdr->SAbbrevDayName1 = pCalHdr->SDayName7 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName1, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName1 = (WORD)Count;
pCalHdr->SAbbrevDayName2 = pCalHdr->SAbbrevDayName1 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName2, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName2 = (WORD)Count;
pCalHdr->SAbbrevDayName3 = pCalHdr->SAbbrevDayName2 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName3, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName3 = (WORD)Count;
pCalHdr->SAbbrevDayName4 = pCalHdr->SAbbrevDayName3 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName4, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName4 = (WORD)Count;
pCalHdr->SAbbrevDayName5 = pCalHdr->SAbbrevDayName4 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName5, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName5 = (WORD)Count;
pCalHdr->SAbbrevDayName6 = pCalHdr->SAbbrevDayName5 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName6, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName6 = (WORD)Count;
pCalHdr->SAbbrevDayName7 = pCalHdr->SAbbrevDayName6 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevDayName7, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevDayName7 = (WORD)Count;
//
// Read in the month information of a locale and store it in the
// locale structure.
//
pCalHdr->SMonthName1 = pCalHdr->SAbbrevDayName7 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName1, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName1 = (WORD)Count;
pCalHdr->SMonthName2 = pCalHdr->SMonthName1 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName2, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName2 = (WORD)Count;
pCalHdr->SMonthName3 = pCalHdr->SMonthName2 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName3, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName3 = (WORD)Count;
pCalHdr->SMonthName4 = pCalHdr->SMonthName3 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName4, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName4 = (WORD)Count;
pCalHdr->SMonthName5 = pCalHdr->SMonthName4 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName5, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName5 = (WORD)Count;
pCalHdr->SMonthName6 = pCalHdr->SMonthName5 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName6, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName6 = (WORD)Count;
pCalHdr->SMonthName7 = pCalHdr->SMonthName6 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName7, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName7 = (WORD)Count;
pCalHdr->SMonthName8 = pCalHdr->SMonthName7 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName8, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName8 = (WORD)Count;
pCalHdr->SMonthName9 = pCalHdr->SMonthName8 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName9, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName9 = (WORD)Count;
pCalHdr->SMonthName10 = pCalHdr->SMonthName9 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName10, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName10 = (WORD)Count;
pCalHdr->SMonthName11 = pCalHdr->SMonthName10 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName11, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName11 = (WORD)Count;
pCalHdr->SMonthName12 = pCalHdr->SMonthName11 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName12, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName12 = (WORD)Count;
pCalHdr->SMonthName13 = pCalHdr->SMonthName12 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSMonthName13, MAX, TRUE ))) { return (1); } pCalCnt->SMonthName13 = (WORD)Count;
pCalHdr->SAbbrevMonthName1 = pCalHdr->SMonthName13 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName1, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName1 = (WORD)Count;
pCalHdr->SAbbrevMonthName2 = pCalHdr->SAbbrevMonthName1 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName2, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName2 = (WORD)Count;
pCalHdr->SAbbrevMonthName3 = pCalHdr->SAbbrevMonthName2 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName3, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName3 = (WORD)Count;
pCalHdr->SAbbrevMonthName4 = pCalHdr->SAbbrevMonthName3 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName4, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName4 = (WORD)Count;
pCalHdr->SAbbrevMonthName5 = pCalHdr->SAbbrevMonthName4 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName5, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName5 = (WORD)Count;
pCalHdr->SAbbrevMonthName6 = pCalHdr->SAbbrevMonthName5 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName6, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName6 = (WORD)Count;
pCalHdr->SAbbrevMonthName7 = pCalHdr->SAbbrevMonthName6 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName7, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName7 = (WORD)Count;
pCalHdr->SAbbrevMonthName8 = pCalHdr->SAbbrevMonthName7 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName8, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName8 = (WORD)Count;
pCalHdr->SAbbrevMonthName9 = pCalHdr->SAbbrevMonthName8 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName9, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName9 = (WORD)Count;
pCalHdr->SAbbrevMonthName10 = pCalHdr->SAbbrevMonthName9 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName10, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName10 = (WORD)Count;
pCalHdr->SAbbrevMonthName11 = pCalHdr->SAbbrevMonthName10 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName11, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName11 = (WORD)Count;
pCalHdr->SAbbrevMonthName12 = pCalHdr->SAbbrevMonthName11 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName12, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName12 = (WORD)Count;
pCalHdr->SAbbrevMonthName13 = pCalHdr->SAbbrevMonthName12 + Count; if (!(Count = ParseLine( pszKeyWord, pCalVar->szSAbbrevMonthName13, MAX, TRUE ))) { return (1); } pCalCnt->SAbbrevMonthName13 = (WORD)Count;
pCalHdr->SEndOfCalendar = pCalHdr->SAbbrevMonthName13 + Count;
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// WriteCalendarInit
//
// This routine writes the number of calendars and the offset to the
// calendar information in the data file.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int WriteCalendarInit( FILE *pOutputFile, int NumCal, int OffCalHdr) { WORD pDummy[MAX]; // dummy storage
DWORD dwValue; // temp storage value
//
// Write the number of calendars to the file.
//
//
// Seek to NumCalendar offset.
//
if (fseek( pOutputFile, LOC_NUM_CAL_WORDS * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Write the number of calendars to the file.
//
dwValue = (DWORD)NumCal; if (FileWrite( pOutputFile, &dwValue, sizeof(DWORD), 1, "Number of Calendars" )) { return (1); }
//
// Write the offset of calendar info to the file.
//
dwValue = (DWORD)OffCalHdr; if (FileWrite( pOutputFile, &dwValue, sizeof(DWORD), 1, "Offset of Calendar Info" )) { return (1); }
//
// Seek to calendar header.
//
if (fseek( pOutputFile, OffCalHdr * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Write zeros in the file to allow the seek to work.
//
memset(pDummy, 0, MAX * sizeof(WORD)); if (FileWrite( pOutputFile, pDummy, sizeof(WORD), NumCal * CALENDAR_HDR_WORDS, "Calendar Header" )) { return (1); }
//
// Seek back to the beginning of the calendar header.
//
if (fseek( pOutputFile, OffCalHdr * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// WriteCalendarInfo
//
// This routine writes the calendar id, offset, and calendar information to
// the output file. It needs to seek ahead to the correct position for the
// calendar information, and then seeks back to the header position. The
// file positions are updated to reflect the next offsets.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int WriteCalendarInfo( DWORD Calendar, int *pOffHdr, int *pOffCal, int OffCalBegin, PCALENDAR_HEADER pCalHdr, PCALENDAR_VARIABLE pCalVar, PCALENDAR_HEADER pCalCnt, FILE *pOutputFile) { int Size; // size of locale information
int TotalSize = 0; // total size of the locale information
int NameSize; // size of name space to subtract
WORD wValue; // temp storage value
if (Verbose) printf("\nWriting Calendar Information for %x...\n", Calendar);
//
// Write the calendar id and offset to the calendar information in
// the calendar header area of the output file.
//
wValue = (WORD)Calendar; if (FileWrite( pOutputFile, &wValue, sizeof(WORD), 1, "Calendar ID" )) { return (1); }
wValue = (WORD)(*pOffCal); if (FileWrite( pOutputFile, &wValue, sizeof(WORD), 1, "Calendar Info Offset" )) { return (1); }
//
// Seek forward to calendar info offset.
//
if (fseek( pOutputFile, (OffCalBegin + (*pOffCal)) * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Write the calendar information to the output file.
// Header Info
// Variable Length Info
//
NameSize = (pCalHdr->IfNames) ? 0 : CAL_NAME_HDR_SIZE; TotalSize = Size = (sizeof(CALENDAR_HEADER) / sizeof(WORD)) - NameSize; if (FileWrite( pOutputFile, pCalHdr, sizeof(WORD), Size, "Calendar Header" )) { return (1); }
if (WriteCalendarVariableLength( pCalCnt, pCalVar, &TotalSize, pOutputFile )) { return (1); }
//
// Set the offsets to their new values.
//
(*pOffHdr) += CALENDAR_HDR_WORDS; (*pOffCal) += TotalSize;
//
// Make sure the size is not wrapping - can't be greater than
// a DWORD.
//
if (*pOffCal > 0xffff) { printf("Size Error: Offset is greater than a WORD for calendar %d.\n", Calendar); return (1); }
//
// Seek back to the calendar header offset.
//
if (fseek( pOutputFile, (*pOffHdr) * sizeof(WORD), 0 )) { printf("Seek Error: Can't seek in file %s.\n", LOCALE_FILE); return (1); }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// WriteCalendarVariableLength
//
// This routine writes the variable length calendar information to the output
// file. It adds on to the total size of the calendar information as it adds
// the variable length information.
//
// 12-10-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int WriteCalendarVariableLength( PCALENDAR_HEADER pCalCnt, PCALENDAR_VARIABLE pCalVar, int *pTotalSize, FILE *pOutputFile) { int Size; // size of string
*pTotalSize += (Size = pCalCnt->SCalendar); if (FileWrite( pOutputFile, pCalVar->szSCalendar, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->STwoDigitYearMax); if (FileWrite( pOutputFile, pCalVar->szSTwoDigitYearMax, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SEraRanges); if (FileWrite( pOutputFile, pCalVar->szSEraRanges, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SShortDate); if (FileWrite( pOutputFile, pCalVar->szSShortDate, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SYearMonth); if (FileWrite( pOutputFile, pCalVar->szSYearMonth, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SLongDate); if (FileWrite( pOutputFile, pCalVar->szSLongDate, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
//
// See if any of the day or month names exist.
//
if (pCalCnt->IfNames == 0) { //
// Return success. Don't write any of the day or month names.
//
return (0); }
*pTotalSize += (Size = pCalCnt->SDayName1); if (FileWrite( pOutputFile, pCalVar->szSDayName1, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SDayName2); if (FileWrite( pOutputFile, pCalVar->szSDayName2, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SDayName3); if (FileWrite( pOutputFile, pCalVar->szSDayName3, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SDayName4); if (FileWrite( pOutputFile, pCalVar->szSDayName4, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SDayName5); if (FileWrite( pOutputFile, pCalVar->szSDayName5, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SDayName6); if (FileWrite( pOutputFile, pCalVar->szSDayName6, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SDayName7); if (FileWrite( pOutputFile, pCalVar->szSDayName7, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName1); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName1, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName2); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName2, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName3); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName3, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName4); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName4, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName5); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName5, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName6); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName6, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevDayName7); if (FileWrite( pOutputFile, pCalVar->szSAbbrevDayName7, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName1); if (FileWrite( pOutputFile, pCalVar->szSMonthName1, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName2); if (FileWrite( pOutputFile, pCalVar->szSMonthName2, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName3); if (FileWrite( pOutputFile, pCalVar->szSMonthName3, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName4); if (FileWrite( pOutputFile, pCalVar->szSMonthName4, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName5); if (FileWrite( pOutputFile, pCalVar->szSMonthName5, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName6); if (FileWrite( pOutputFile, pCalVar->szSMonthName6, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName7); if (FileWrite( pOutputFile, pCalVar->szSMonthName7, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName8); if (FileWrite( pOutputFile, pCalVar->szSMonthName8, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName9); if (FileWrite( pOutputFile, pCalVar->szSMonthName9, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName10); if (FileWrite( pOutputFile, pCalVar->szSMonthName10, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName11); if (FileWrite( pOutputFile, pCalVar->szSMonthName11, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName12); if (FileWrite( pOutputFile, pCalVar->szSMonthName12, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SMonthName13); if (FileWrite( pOutputFile, pCalVar->szSMonthName13, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName1); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName1, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName2); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName2, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName3); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName3, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName4); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName4, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName5); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName5, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName6); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName6, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName7); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName7, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName8); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName8, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName9); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName9, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName10); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName10, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName11); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName11, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName12); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName12, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
*pTotalSize += (Size = pCalCnt->SAbbrevMonthName13); if (FileWrite( pOutputFile, pCalVar->szSAbbrevMonthName13, sizeof(WORD), Size, "Calendar Variable Info" )) { return (1); }
//
// Return success.
//
return (0); }
////////////////////////////////////////////////////////////////////////////
//
// ConvertUnicodeToWord
//
// This routine converts a Unicode string to a WORD value.
//
// 08-21-95 JulieB Created.
////////////////////////////////////////////////////////////////////////////
#define ISDIGIT(c) ((c) >= L'0' && (c) <= L'9')
int ConvertUnicodeToWord( WORD *pString, WORD *pValue) { UINT Val = 0;
while (*pString) { if (ISDIGIT(*pString)) { Val *= 10; Val += *pString - L'0'; pString++; } else { //
// Error.
//
return (0); } }
if (Val > 0xffff) { //
// Code page cannot be greater than a WORD value.
//
return (0); }
*pValue = (WORD)Val;
return (1); }
|