|
|
/*++
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); }
|