windows-nt/Source/XPSP1/NT/base/win32/winnls/nlstrans/geo.c
2020-09-26 16:20:57 +08:00

300 lines
8.8 KiB
C

/*++
Copyright (c) 1991-1999, Microsoft Corporation All rights reserved.
Module Name:
geo.c
Abstract:
This file contains functions necessary to parse amd write the GEO
specific tables to a data file.
External Routines in this file:
ParseWriteGEO
Revision History:
11-02-99 WeiWu Created.
03-10-00 lguindon Began GEO API port.
09-12-00 JulieB Fixed buffer sizes and other problems.
--*/
//
// Include Files.
//
#include "nlstrans.h"
////////////////////////////////////////////////////////////////////////////
//
// ParseWriteGEO
//
// This routine parses the input file for the GEO specific tables, and
// then writes the data to the output file.
//
////////////////////////////////////////////////////////////////////////////
int
ParseWriteGEO(
PSZ pszKeyWord)
{
int nSize = 0;
int Ctr;
FILE *pOutputFile;
GEOTABLEHDR GeoTableHdr;
if ((pOutputFile = fopen(GEOFILE, "w+b")) == 0)
{
printf("Error opening output file %s.\n", GEOFILE);
return (1);
}
//
// Prepare GEO table header.
//
wcscpy(GeoTableHdr.szSig, L"geo");
//
// Write GEO table header place holder.
//
if (FileWrite(pOutputFile, &GeoTableHdr, sizeof(GEOTABLEHDR), 1, "GEOHEADER"))
{
fclose(pOutputFile);
return (1);
}
//
// Scan GEO text file.
//
while (fscanf(pInputFile, "%s", pszKeyWord) == 1)
{
//
// GEOINFO table.
//
if (_stricmp(pszKeyWord, "GEOINFO") == 0)
{
PGEODATA pGeoData = NULL;
if (Verbose)
{
printf("\n\nFound GEOINFO keyword.\n");
}
GetSize(&nSize);
if (nSize)
{
pGeoData = (PGEODATA)malloc(sizeof(GEODATA) * nSize);
}
if (pGeoData)
{
for (Ctr = 0; Ctr < nSize; Ctr++)
{
CHAR szLatitude[MAX_LATITUDE];
CHAR szLongitude[MAX_LONGITUDE];
CHAR szISO3166Abbrev2[MAX_ISO_ABBREV];
CHAR szISO3166Abbrev3[MAX_ISO_ABBREV];
//
// Scan Values
//
int NumItems = 0;
NumItems = fscanf( pInputFile,
"%ld %s %s %lu %ld %s %s %lu ;%*[^\n]",
&pGeoData[Ctr].GeoId,
szLatitude,
szLongitude,
&pGeoData[Ctr].GeoClass,
&pGeoData[Ctr].ParentGeoId,
szISO3166Abbrev2,
szISO3166Abbrev3,
&pGeoData[Ctr].wISO3166 );
//
// Convert value to UNICODE
//
if (MultiByteToWideChar( CP_ACP,
0,
szLatitude,
-1,
pGeoData[Ctr].szLatitude,
MAX_LATITUDE ) == 0)
{
printf("Error converting latitude string in file %s.\n", GEOFILE);
fclose(pOutputFile);
free(pGeoData);
return (1);
}
if (MultiByteToWideChar( CP_ACP,
0,
szLongitude,
-1,
pGeoData[Ctr].szLongitude,
MAX_LONGITUDE ) == 0)
{
printf("Error converting longitude string in file %s.\n", GEOFILE);
fclose(pOutputFile);
free(pGeoData);
return (1);
}
if (MultiByteToWideChar( CP_ACP,
0,
szISO3166Abbrev2,
-1,
pGeoData[Ctr].szISO3166Abbrev2,
MAX_ISO_ABBREV ) == 0)
{
printf("Error converting 2-char abbreviated name in file %s.\n", GEOFILE);
fclose(pOutputFile);
free(pGeoData);
return (1);
}
if (MultiByteToWideChar( CP_ACP,
0,
szISO3166Abbrev3,
-1,
pGeoData[Ctr].szISO3166Abbrev3,
MAX_ISO_ABBREV ) == 0)
{
printf("Error converting 3-char abbreviated name in file %s.\n", GEOFILE);
fclose(pOutputFile);
free(pGeoData);
return (1);
}
//
// Print if in verbose mode
//
if (Verbose)
{
printf("ID:%ld, LAT:%s, LON:%s, CLASS:%lu, PARENT:%ld, ISO3166-2:%s, IS03166-3:%s, ISO3166:%lu \n",
pGeoData[Ctr].GeoId,
szLatitude,
szLongitude,
pGeoData[Ctr].GeoClass,
pGeoData[Ctr].ParentGeoId,
szISO3166Abbrev2,
szISO3166Abbrev3,
pGeoData[Ctr].wISO3166 );
}
}
//
// Update GEO table header.
//
GeoTableHdr.dwOffsetGeoInfo = ftell(pOutputFile);
GeoTableHdr.nGeoInfo = nSize;
//
// Write GEOINFO.
//
if (FileWrite(pOutputFile, pGeoData, sizeof(GEODATA), nSize, "GEOINFO"))
{
fclose(pOutputFile);
free(pGeoData);
return (1);
}
free(pGeoData);
}
}
//
// GEOLCID table.
//
else if (_stricmp(pszKeyWord, "GEOLCID") == 0)
{
PGEOLCID pGeoLCID = NULL;
if (Verbose)
printf("\n\nFound GEOLCID keyword.\n");
GetSize(&nSize);
if (nSize)
{
pGeoLCID = (PGEOLCID)malloc(sizeof(GEOLCID) * nSize);
}
if (pGeoLCID)
{
for (Ctr = 0; Ctr < nSize; Ctr++)
{
//
// Scan values
//
fscanf( pInputFile,
"%ld %x %lx ;%*[^\n]",
&pGeoLCID[Ctr].GeoId,
&pGeoLCID[Ctr].LangId,
&pGeoLCID[Ctr].lcid);
//
// Print the values if in Verbose Mode
//
if (Verbose)
{
printf("ID:%ld, LANGID:0x%04x, LCID:0x%08x\n",
pGeoLCID[Ctr].GeoId,
pGeoLCID[Ctr].LangId,
pGeoLCID[Ctr].lcid);
}
}
GeoTableHdr.dwOffsetGeoLCID = ftell(pOutputFile);
GeoTableHdr.nGeoLCID = nSize;
if (FileWrite(pOutputFile, pGeoLCID, sizeof(GEOLCID), nSize, "GEOLCID"))
{
fclose(pOutputFile);
free(pGeoLCID);
return (1);
}
free(pGeoLCID);
}
}
}
//
// Get file size.
//
GeoTableHdr.nFileSize = ftell(pOutputFile);
//
// Rewind Output file.
//
fseek(pOutputFile, 0, SEEK_SET);
//
// Update GEO table header.
//
if (FileWrite(pOutputFile, &GeoTableHdr, sizeof(GEOTABLEHDR), 1, "GEOHEADER"))
{
fclose(pOutputFile);
return (1);
}
//
// Close the output file.
//
fclose(pOutputFile);
//
// Return success.
//
printf("\nSuccessfully wrote output file %s\n", GEOFILE);
return (0);
}