mirror of
https://github.com/BertoldVdb/ZoneDetect.git
synced 2026-04-27 14:57:40 +00:00
commit
8bdf7a5326
4 changed files with 153 additions and 43 deletions
3
demo.c
3
demo.c
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, Bertold Van den Bergh (vandenbergh@bertold.org)
|
* Copyright (c) 2018, Bertold Van den Bergh (vandenbergh@bertold.org)
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
|
@ -92,6 +93,8 @@ int main(int argc, char *argv[])
|
||||||
ZoneDetectResult *results = ZDLookup(cd, lat, lon, &safezone);
|
ZoneDetectResult *results = ZDLookup(cd, lat, lon, &safezone);
|
||||||
printResults(cd, results, safezone);
|
printResults(cd, results, safezone);
|
||||||
|
|
||||||
|
printf("The simple string is [%s]\n", ZDHelperSimpleLookupString(cd, lat, lon));
|
||||||
|
|
||||||
ZDCloseDatabase(cd);
|
ZDCloseDatabase(cd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -60,3 +60,11 @@ install:
|
||||||
cp zonedetect.h /usr/include/
|
cp zonedetect.h /usr/include/
|
||||||
cp $(EXECUTABLE) /usr/lib/
|
cp $(EXECUTABLE) /usr/lib/
|
||||||
ldconfig
|
ldconfig
|
||||||
|
|
||||||
|
nice:
|
||||||
|
mkdir -p bak/
|
||||||
|
touch $(addsuffix .orig,$(INCLUDES_SRC))
|
||||||
|
touch $(addsuffix .orig,$(SOURCES_SRC))
|
||||||
|
astyle --style=k/r --indent=spaces=4 --indent-cases --indent-switches $(INCLUDES_SRC) $(SOURCES_SRC)
|
||||||
|
mv $(addsuffix .orig,$(INCLUDES_SRC)) bak/
|
||||||
|
mv $(addsuffix .orig,$(SOURCES_SRC)) bak/
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ struct ZoneDetectOpaque {
|
||||||
off_t length;
|
off_t length;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uint8_t closeType;
|
||||||
uint8_t *mapping;
|
uint8_t *mapping;
|
||||||
|
|
||||||
uint8_t tableType;
|
uint8_t tableType;
|
||||||
|
|
@ -785,6 +786,7 @@ void ZDCloseDatabase(ZoneDetect *library)
|
||||||
free(library->notice);
|
free(library->notice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(library->closeType == 0) {
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
if(library->mapping && !UnmapViewOfFile(library->mapping)) zdError(ZD_E_DB_MUNMAP_MSVIEW, (int)GetLastError());
|
if(library->mapping && !UnmapViewOfFile(library->mapping)) zdError(ZD_E_DB_MUNMAP_MSVIEW, (int)GetLastError());
|
||||||
if(library->fdMap && !CloseHandle(library->fdMap)) zdError(ZD_E_DB_MUNMAP, (int)GetLastError());
|
if(library->fdMap && !CloseHandle(library->fdMap)) zdError(ZD_E_DB_MUNMAP, (int)GetLastError());
|
||||||
|
|
@ -793,11 +795,42 @@ void ZDCloseDatabase(ZoneDetect *library)
|
||||||
if(library->mapping && munmap(library->mapping, (size_t)(library->length))) zdError(ZD_E_DB_MUNMAP, errno);
|
if(library->mapping && munmap(library->mapping, (size_t)(library->length))) zdError(ZD_E_DB_MUNMAP, errno);
|
||||||
if(library->fd >= 0 && close(library->fd)) zdError(ZD_E_DB_CLOSE, errno);
|
if(library->fd >= 0 && close(library->fd)) zdError(ZD_E_DB_CLOSE, errno);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
free(library);
|
free(library);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ZoneDetect *ZDOpenDatabaseFromMemory(void* buffer, size_t length)
|
||||||
|
{
|
||||||
|
ZoneDetect *const library = malloc(sizeof *library);
|
||||||
|
|
||||||
|
if(library) {
|
||||||
|
memset(library, 0, sizeof(*library));
|
||||||
|
library->closeType = 1;
|
||||||
|
library->length = (long int)length;
|
||||||
|
|
||||||
|
if(library->length <= 0) {
|
||||||
|
zdError(ZD_E_DB_SEEK, errno);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
library->mapping = buffer;
|
||||||
|
|
||||||
|
/* Parse the header */
|
||||||
|
if(ZDParseHeader(library)) {
|
||||||
|
zdError(ZD_E_PARSE_HEADER, 0);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return library;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
ZDCloseDatabase(library);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ZoneDetect *ZDOpenDatabase(const char *path)
|
ZoneDetect *ZDOpenDatabase(const char *path)
|
||||||
{
|
{
|
||||||
ZoneDetect *const library = malloc(sizeof *library);
|
ZoneDetect *const library = malloc(sizeof *library);
|
||||||
|
|
@ -1090,3 +1123,66 @@ int ZDSetErrorHandler(void (*handler)(int, int))
|
||||||
zdErrorHandler = handler;
|
zdErrorHandler = handler;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* ZDHelperSimpleLookupString(const ZoneDetect* library, float lat, float lon)
|
||||||
|
{
|
||||||
|
ZoneDetectResult *result = ZDLookup(library, lat, lon, NULL);
|
||||||
|
if(!result) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* output = NULL;
|
||||||
|
|
||||||
|
if(result[0].lookupResult == ZD_LOOKUP_END) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* strings[2] = {NULL};
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < result[0].numFields; i++) {
|
||||||
|
if(result[0].fieldNames[i] && result[0].data[i]) {
|
||||||
|
if(library->tableType == 'T') {
|
||||||
|
if(!strcmp(result[0].fieldNames[i], "TimezoneIdPrefix")) {
|
||||||
|
strings[0] = result[0].data[i];
|
||||||
|
}
|
||||||
|
if(!strcmp(result[0].fieldNames[i], "TimezoneId")) {
|
||||||
|
strings[1] = result[0].data[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(library->tableType == 'C') {
|
||||||
|
if(!strcmp(result[0].fieldNames[i], "Name")) {
|
||||||
|
strings[0] = result[0].data[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t length = 0;
|
||||||
|
for(unsigned int i=0; i<sizeof(strings)/sizeof(char*); i++) {
|
||||||
|
if(strings[i]) {
|
||||||
|
size_t partLength = strlen(strings[i]);
|
||||||
|
if(partLength > 512) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
length += partLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(length == 0) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
length += 1;
|
||||||
|
|
||||||
|
output = (char*)malloc(length);
|
||||||
|
output[0] = 0;
|
||||||
|
for(unsigned int i=0; i<sizeof(strings)/sizeof(char*); i++) {
|
||||||
|
if(strings[i]) {
|
||||||
|
strcat(output + strlen(output), strings[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
ZDFreeResults(result);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ZD_EXPORT ZoneDetect *ZDOpenDatabase(const char *path);
|
ZD_EXPORT ZoneDetect *ZDOpenDatabase(const char *path);
|
||||||
|
ZD_EXPORT ZoneDetect *ZDOpenDatabaseFromMemory(void* buffer, size_t length);
|
||||||
ZD_EXPORT void ZDCloseDatabase(ZoneDetect *library);
|
ZD_EXPORT void ZDCloseDatabase(ZoneDetect *library);
|
||||||
|
|
||||||
ZD_EXPORT ZoneDetectResult *ZDLookup(const ZoneDetect *library, float lat, float lon, float *safezone);
|
ZD_EXPORT ZoneDetectResult *ZDLookup(const ZoneDetect *library, float lat, float lon, float *safezone);
|
||||||
|
|
@ -81,6 +82,8 @@ ZD_EXPORT const char *ZDGetErrorString(int errZD);
|
||||||
|
|
||||||
ZD_EXPORT float* ZDPolygonToList(const ZoneDetect *library, uint32_t polygonId, size_t* length);
|
ZD_EXPORT float* ZDPolygonToList(const ZoneDetect *library, uint32_t polygonId, size_t* length);
|
||||||
|
|
||||||
|
ZD_EXPORT char* ZDHelperSimpleLookupString(const ZoneDetect* library, float lat, float lon);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue