300 lines
8.8 KiB
C
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);
|
|
}
|