Remove a hack that originally worked around a buffer overflow elsewhere in the file. The buffer overflow was fixed long ago, but the hack was not removed.
160 lines
4.2 KiB
C++
160 lines
4.2 KiB
C++
/* -*- Mode: C++ -*- *****************************************************
|
|
* timezone.cc
|
|
* Written by Durk Talsma. Started July 1999.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*
|
|
**************************************************************************/
|
|
|
|
/*************************************************************************
|
|
*
|
|
* Timezone is derived from geocoord, and stores the timezone centerpoint,
|
|
* as well as the countrycode and the timezone descriptor. The latter is
|
|
* used in order to get the local time.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "timezone.h"
|
|
|
|
Timezone::Timezone(float la, float lo, char* cc, char* desc) :
|
|
GeoCoord(la, lo)
|
|
{
|
|
countryCode = strdup(cc);
|
|
descriptor = strdup(desc);
|
|
}
|
|
|
|
/* Build a timezone object from a textline in zone.tab */
|
|
Timezone::Timezone(const char *infoString) :
|
|
GeoCoord()
|
|
{
|
|
int i = 0;
|
|
while (infoString[i] != '\t')
|
|
i++;
|
|
char buffer[128];
|
|
char latlon[128];
|
|
strncpy(buffer, infoString, i);
|
|
buffer[i] = 0;
|
|
countryCode = strdup(buffer);
|
|
i ++;
|
|
int start = i;
|
|
while (infoString[i] != '\t') {
|
|
i++;
|
|
}
|
|
int size = i - start;
|
|
strncpy(latlon, (&infoString[start]), size);
|
|
latlon[size] = 0;
|
|
char sign;
|
|
sign = latlon[0];
|
|
strncpy(buffer, &latlon[1], 2);
|
|
buffer[2] = 0;
|
|
lat = atof(buffer);
|
|
strncpy(buffer, &latlon[3], 2);
|
|
buffer[2] = 0;
|
|
lat += (atof(buffer) / 60);
|
|
int nextPos;
|
|
if (strlen(latlon) > 12) {
|
|
nextPos = 7;
|
|
strncpy(buffer, &latlon[5], 2);
|
|
buffer[2] = 0;
|
|
lat += (atof(buffer) / 3600.0);
|
|
} else {
|
|
nextPos = 5;
|
|
}
|
|
if (sign == '-') {
|
|
lat = -lat;
|
|
}
|
|
|
|
sign = latlon[nextPos];
|
|
nextPos++;
|
|
strncpy(buffer, &latlon[nextPos], 3);
|
|
buffer[3] = 0;
|
|
lon = atof(buffer);
|
|
nextPos += 3;
|
|
strncpy(buffer, &latlon[nextPos], 2);
|
|
buffer[2] = 0;
|
|
|
|
lon += (atof(buffer) / 60);
|
|
if (strlen(latlon) > 12) {
|
|
nextPos += 2;
|
|
strncpy(buffer, &latlon[nextPos], 2);
|
|
buffer[2] = 0;
|
|
lon += (atof (buffer) / 3600.00);
|
|
}
|
|
if (sign == '-') {
|
|
lon = -lon;
|
|
}
|
|
i ++;
|
|
start = i;
|
|
while (!((infoString[i] == '\t') || (infoString[i] == '\n'))) {
|
|
i++;
|
|
}
|
|
size = i - start;
|
|
strncpy(buffer, (&infoString[start]), size);
|
|
buffer[size] = 0;
|
|
descriptor = strdup(buffer);
|
|
}
|
|
|
|
/* the copy constructor */
|
|
Timezone::Timezone(const Timezone& other)
|
|
{
|
|
lat = other.getLat();
|
|
lon = other.getLon();
|
|
countryCode = strdup(other.countryCode);
|
|
descriptor = strdup(other.descriptor);
|
|
}
|
|
|
|
|
|
/********* Member functions for TimezoneContainer class ********/
|
|
|
|
TimezoneContainer::TimezoneContainer(const char *filename)
|
|
{
|
|
char buffer[256];
|
|
FILE* infile = fopen(filename, "rb");
|
|
if (!(infile)) {
|
|
fprintf(stderr, "Unable to open file %s\n", filename);
|
|
exit(1);
|
|
} else {
|
|
errno = 0;
|
|
|
|
while (1) {
|
|
fgets(buffer, 256, infile);
|
|
if (feof(infile)) {
|
|
break;
|
|
}
|
|
for (char *p = buffer; *p; p++) {
|
|
if (*p == '#') {
|
|
*p = 0;
|
|
break;
|
|
}
|
|
}
|
|
if (buffer[0]) {
|
|
data.push_back(new Timezone(buffer));
|
|
}
|
|
}
|
|
if ( errno ) {
|
|
perror( "TimezoneContainer()" );
|
|
errno = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
TimezoneContainer::~TimezoneContainer()
|
|
{
|
|
}
|