#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#if defined(_WIN32) && !defined(__MINGW32__)
#include "config-msvc.h"
#else
#include "config.h"
#endif
#include <spatialite/sqlite.h>
#include <spatialite/gaiageo.h>
GAIAGEO_DECLARE int
gaiaEndianArch ()
{
union cvt
{
unsigned char byte[4];
int int_value;
} convert;
convert.int_value = 1;
if (convert.byte[0] == 0)
return 0;
return 1;
}
GAIAGEO_DECLARE short
gaiaImport16 (const unsigned char *p, int little_endian, int little_endian_arch)
{
union cvt
{
unsigned char byte[2];
short short_value;
} convert;
if (little_endian_arch)
{
if (!little_endian)
{
convert.byte[0] = *(p + 1);
convert.byte[1] = *(p + 0);
}
else
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
}
}
else
{
if (!little_endian)
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
}
else
{
convert.byte[0] = *(p + 1);
convert.byte[1] = *(p + 0);
}
}
return convert.short_value;
}
GAIAGEO_DECLARE int
gaiaImport32 (const unsigned char *p, int little_endian, int little_endian_arch)
{
union cvt
{
unsigned char byte[4];
int int_value;
} convert;
if (little_endian_arch)
{
if (!little_endian)
{
convert.byte[0] = *(p + 3);
convert.byte[1] = *(p + 2);
convert.byte[2] = *(p + 1);
convert.byte[3] = *(p + 0);
}
else
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
}
}
else
{
if (!little_endian)
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
}
else
{
convert.byte[0] = *(p + 3);
convert.byte[1] = *(p + 2);
convert.byte[2] = *(p + 1);
convert.byte[3] = *(p + 0);
}
}
return convert.int_value;
}
GAIAGEO_DECLARE unsigned int
gaiaImportU32 (const unsigned char *p, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[4];
unsigned int int_value;
} convert;
if (little_endian_arch)
{
if (!little_endian)
{
convert.byte[0] = *(p + 3);
convert.byte[1] = *(p + 2);
convert.byte[2] = *(p + 1);
convert.byte[3] = *(p + 0);
}
else
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
}
}
else
{
if (!little_endian)
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
}
else
{
convert.byte[0] = *(p + 3);
convert.byte[1] = *(p + 2);
convert.byte[2] = *(p + 1);
convert.byte[3] = *(p + 0);
}
}
return convert.int_value;
}
GAIAGEO_DECLARE float
gaiaImportF32 (const unsigned char *p, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[4];
float flt_value;
} convert;
if (little_endian_arch)
{
if (!little_endian)
{
convert.byte[0] = *(p + 3);
convert.byte[1] = *(p + 2);
convert.byte[2] = *(p + 1);
convert.byte[3] = *(p + 0);
}
else
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
}
}
else
{
if (!little_endian)
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
}
else
{
convert.byte[0] = *(p + 3);
convert.byte[1] = *(p + 2);
convert.byte[2] = *(p + 1);
convert.byte[3] = *(p + 0);
}
}
return convert.flt_value;
}
GAIAGEO_DECLARE double
gaiaImport64 (const unsigned char *p, int little_endian, int little_endian_arch)
{
union cvt
{
unsigned char byte[8];
double double_value;
} convert;
if (little_endian_arch)
{
if (!little_endian)
{
convert.byte[0] = *(p + 7);
convert.byte[1] = *(p + 6);
convert.byte[2] = *(p + 5);
convert.byte[3] = *(p + 4);
convert.byte[4] = *(p + 3);
convert.byte[5] = *(p + 2);
convert.byte[6] = *(p + 1);
convert.byte[7] = *(p + 0);
}
else
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
convert.byte[4] = *(p + 4);
convert.byte[5] = *(p + 5);
convert.byte[6] = *(p + 6);
convert.byte[7] = *(p + 7);
}
}
else
{
if (!little_endian)
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
convert.byte[4] = *(p + 4);
convert.byte[5] = *(p + 5);
convert.byte[6] = *(p + 6);
convert.byte[7] = *(p + 7);
}
else
{
convert.byte[0] = *(p + 7);
convert.byte[1] = *(p + 6);
convert.byte[2] = *(p + 5);
convert.byte[3] = *(p + 4);
convert.byte[4] = *(p + 3);
convert.byte[5] = *(p + 2);
convert.byte[6] = *(p + 1);
convert.byte[7] = *(p + 0);
}
}
return convert.double_value;
}
GAIAGEO_DECLARE sqlite3_int64
gaiaImportI64 (const unsigned char *p, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[8];
sqlite3_int64 int64_value;
} convert;
if (little_endian_arch)
{
if (!little_endian)
{
convert.byte[0] = *(p + 7);
convert.byte[1] = *(p + 6);
convert.byte[2] = *(p + 5);
convert.byte[3] = *(p + 4);
convert.byte[4] = *(p + 3);
convert.byte[5] = *(p + 2);
convert.byte[6] = *(p + 1);
convert.byte[7] = *(p + 0);
}
else
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
convert.byte[4] = *(p + 4);
convert.byte[5] = *(p + 5);
convert.byte[6] = *(p + 6);
convert.byte[7] = *(p + 7);
}
}
else
{
if (!little_endian)
{
convert.byte[0] = *(p + 0);
convert.byte[1] = *(p + 1);
convert.byte[2] = *(p + 2);
convert.byte[3] = *(p + 3);
convert.byte[4] = *(p + 4);
convert.byte[5] = *(p + 5);
convert.byte[6] = *(p + 6);
convert.byte[7] = *(p + 7);
}
else
{
convert.byte[0] = *(p + 7);
convert.byte[1] = *(p + 6);
convert.byte[2] = *(p + 5);
convert.byte[3] = *(p + 4);
convert.byte[4] = *(p + 3);
convert.byte[5] = *(p + 2);
convert.byte[6] = *(p + 1);
convert.byte[7] = *(p + 0);
}
}
return convert.int64_value;
}
GAIAGEO_DECLARE void
gaiaExport16 (unsigned char *p, short value, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[2];
short short_value;
} convert;
convert.short_value = value;
if (little_endian_arch)
{
if (!little_endian)
{
*(p + 1) = convert.byte[1];
*(p + 0) = convert.byte[0];
}
else
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
}
}
else
{
if (!little_endian)
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
}
else
{
*(p + 1) = convert.byte[0];
*(p + 0) = convert.byte[1];
}
}
}
GAIAGEO_DECLARE void
gaiaExport32 (unsigned char *p, int value, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[4];
int int_value;
} convert;
convert.int_value = value;
if (little_endian_arch)
{
if (!little_endian)
{
*(p + 3) = convert.byte[0];
*(p + 2) = convert.byte[1];
*(p + 1) = convert.byte[2];
*(p + 0) = convert.byte[3];
}
else
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
}
}
else
{
if (!little_endian)
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
}
else
{
*(p + 3) = convert.byte[0];
*(p + 2) = convert.byte[1];
*(p + 1) = convert.byte[2];
*(p + 0) = convert.byte[3];
}
}
}
GAIAGEO_DECLARE void
gaiaExportU32 (unsigned char *p, unsigned int value, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[4];
unsigned int int_value;
} convert;
convert.int_value = value;
if (little_endian_arch)
{
if (!little_endian)
{
*(p + 3) = convert.byte[0];
*(p + 2) = convert.byte[1];
*(p + 1) = convert.byte[2];
*(p + 0) = convert.byte[3];
}
else
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
}
}
else
{
if (!little_endian)
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
}
else
{
*(p + 3) = convert.byte[0];
*(p + 2) = convert.byte[1];
*(p + 1) = convert.byte[2];
*(p + 0) = convert.byte[3];
}
}
}
GAIAGEO_DECLARE void
gaiaExportF32 (unsigned char *p, float value, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[4];
float flt_value;
} convert;
convert.flt_value = value;
if (little_endian_arch)
{
if (!little_endian)
{
*(p + 3) = convert.byte[0];
*(p + 2) = convert.byte[1];
*(p + 1) = convert.byte[2];
*(p + 0) = convert.byte[3];
}
else
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
}
}
else
{
if (!little_endian)
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
}
else
{
*(p + 3) = convert.byte[0];
*(p + 2) = convert.byte[1];
*(p + 1) = convert.byte[2];
*(p + 0) = convert.byte[3];
}
}
}
GAIAGEO_DECLARE void
gaiaExport64 (unsigned char *p, double value, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[8];
double double_value;
} convert;
convert.double_value = value;
if (little_endian_arch)
{
if (!little_endian)
{
*(p + 7) = convert.byte[0];
*(p + 6) = convert.byte[1];
*(p + 5) = convert.byte[2];
*(p + 4) = convert.byte[3];
*(p + 3) = convert.byte[4];
*(p + 2) = convert.byte[5];
*(p + 1) = convert.byte[6];
*(p + 0) = convert.byte[7];
}
else
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
*(p + 4) = convert.byte[4];
*(p + 5) = convert.byte[5];
*(p + 6) = convert.byte[6];
*(p + 7) = convert.byte[7];
}
}
else
{
if (!little_endian)
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
*(p + 4) = convert.byte[4];
*(p + 5) = convert.byte[5];
*(p + 6) = convert.byte[6];
*(p + 7) = convert.byte[7];
}
else
{
*(p + 7) = convert.byte[0];
*(p + 6) = convert.byte[1];
*(p + 5) = convert.byte[2];
*(p + 4) = convert.byte[3];
*(p + 3) = convert.byte[4];
*(p + 2) = convert.byte[5];
*(p + 1) = convert.byte[6];
*(p + 0) = convert.byte[7];
}
}
}
GAIAGEO_DECLARE void
gaiaExportI64 (unsigned char *p, sqlite3_int64 value, int little_endian,
int little_endian_arch)
{
union cvt
{
unsigned char byte[8];
sqlite3_int64 int64_value;
} convert;
convert.int64_value = value;
if (little_endian_arch)
{
if (!little_endian)
{
*(p + 7) = convert.byte[0];
*(p + 6) = convert.byte[1];
*(p + 5) = convert.byte[2];
*(p + 4) = convert.byte[3];
*(p + 3) = convert.byte[4];
*(p + 2) = convert.byte[5];
*(p + 1) = convert.byte[6];
*(p + 0) = convert.byte[7];
}
else
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
*(p + 4) = convert.byte[4];
*(p + 5) = convert.byte[5];
*(p + 6) = convert.byte[6];
*(p + 7) = convert.byte[7];
}
}
else
{
if (!little_endian)
{
*(p + 0) = convert.byte[0];
*(p + 1) = convert.byte[1];
*(p + 2) = convert.byte[2];
*(p + 3) = convert.byte[3];
*(p + 4) = convert.byte[4];
*(p + 5) = convert.byte[5];
*(p + 6) = convert.byte[6];
*(p + 7) = convert.byte[7];
}
else
{
*(p + 7) = convert.byte[0];
*(p + 6) = convert.byte[1];
*(p + 5) = convert.byte[2];
*(p + 4) = convert.byte[3];
*(p + 3) = convert.byte[4];
*(p + 2) = convert.byte[5];
*(p + 1) = convert.byte[6];
*(p + 0) = convert.byte[7];
}
}
}