#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#if defined(_WIN32) && !defined(__MINGW32__)
#include "config-msvc.h"
#else
#include "config.h"
#endif
#include <spatialite/sqlite.h>
#include <spatialite/debug.h>
#include <spatialite/gaiageo.h>
#if defined(_WIN32) || defined(WIN32)
#include <io.h>
#ifndef isatty
#define isatty _isatty
#endif
#ifndef fileno
#define fileno _fileno
#endif
#endif
#define VANUATU_DYN_NONE 0
#define VANUATU_DYN_POINT 1
#define VANUATU_DYN_LINESTRING 2
#define VANUATU_DYN_POLYGON 3
#define VANUATU_DYN_RING 4
#define VANUATU_DYN_GEOMETRY 5
#define VANUATU_DYN_BLOCK 1024
#define YYMINORTYPE VANUATU_MINORTYPE
#define YY_CHAR VANUATU_YY_CHAR
#define input vanuatu_input
#define ParseAlloc vanuatuParseAlloc
#define ParseFree vanuatuParseFree
#define ParseStackPeak vanuatuParseStackPeak
#define Parse vanuatuParse
#define yyStackEntry vanuatu_yyStackEntry
#define yyzerominor vanuatu_yyzerominor
#define yy_accept vanuatu_yy_accept
#define yy_action vanuatu_yy_action
#define yy_base vanuatu_yy_base
#define yy_buffer_stack vanuatu_yy_buffer_stack
#define yy_buffer_stack_max vanuatu_yy_buffer_stack_max
#define yy_buffer_stack_top vanuatu_yy_buffer_stack_top
#define yy_c_buf_p vanuatu_yy_c_buf_p
#define yy_chk vanuatu_yy_chk
#define yy_def vanuatu_yy_def
#define yy_default vanuatu_yy_default
#define yy_destructor vanuatu_yy_destructor
#define yy_ec vanuatu_yy_ec
#define yy_fatal_error vanuatu_yy_fatal_error
#define yy_find_reduce_action vanuatu_yy_find_reduce_action
#define yy_find_shift_action vanuatu_yy_find_shift_action
#define yy_get_next_buffer vanuatu_yy_get_next_buffer
#define yy_get_previous_state vanuatu_yy_get_previous_state
#define yy_init vanuatu_yy_init
#define yy_init_globals vanuatu_yy_init_globals
#define yy_lookahead vanuatu_yy_lookahead
#define yy_meta vanuatu_yy_meta
#define yy_nxt vanuatu_yy_nxt
#define yy_parse_failed vanuatu_yy_parse_failed
#define yy_pop_parser_stack vanuatu_yy_pop_parser_stack
#define yy_reduce vanuatu_yy_reduce
#define yy_reduce_ofst vanuatu_yy_reduce_ofst
#define yy_shift vanuatu_yy_shift
#define yy_shift_ofst vanuatu_yy_shift_ofst
#define yy_start vanuatu_yy_start
#define yy_state_type vanuatu_yy_state_type
#define yy_syntax_error vanuatu_yy_syntax_error
#define yy_trans_info vanuatu_yy_trans_info
#define yy_try_NUL_trans vanuatu_yy_try_NUL_trans
#define yyParser vanuatu_yyParser
#define yyStackEntry vanuatu_yyStackEntry
#define yyStackOverflow vanuatu_yyStackOverflow
#define yyRuleInfo vanuatu_yyRuleInfo
#define yyunput vanuatu_yyunput
#define yyzerominor vanuatu_yyzerominor
#define yyTraceFILE vanuatu_yyTraceFILE
#define yyTracePrompt vanuatu_yyTracePrompt
#define yyTokenName vanuatu_yyTokenName
#define yyRuleName vanuatu_yyRuleName
#define ParseTrace vanuatu_ParseTrace
#define yylex vanuatu_yylex
#define YY_DECL int yylex (yyscan_t yyscanner)
#include "vanuatuWkt.h"
typedef union
{
double dval;
struct symtab *symp;
} vanuatu_yystype;
#define YYSTYPE vanuatu_yystype
struct vanuatu_dyn_block
{
int type[VANUATU_DYN_BLOCK];
void *ptr[VANUATU_DYN_BLOCK];
int index;
struct vanuatu_dyn_block *next;
};
struct vanuatu_data
{
int vanuatu_parse_error;
int vanuatu_line;
int vanuatu_col;
struct vanuatu_dyn_block *vanuatu_first_dyn_block;
struct vanuatu_dyn_block *vanuatu_last_dyn_block;
gaiaGeomCollPtr result;
YYSTYPE VanuatuWktlval;
};
static struct vanuatu_dyn_block *
vanuatuCreateDynBlock (void)
{
int i;
struct vanuatu_dyn_block *p = malloc (sizeof (struct vanuatu_dyn_block));
for (i = 0; i < VANUATU_DYN_BLOCK; i++)
{
p->type[i] = VANUATU_DYN_NONE;
p->ptr[i] = NULL;
}
p->index = 0;
p->next = NULL;
return p;
}
static void
vanuatuMapDynAlloc (struct vanuatu_data *p_data, int type, void *ptr)
{
struct vanuatu_dyn_block *p;
if (p_data->vanuatu_first_dyn_block == NULL)
{
p = vanuatuCreateDynBlock ();
p_data->vanuatu_first_dyn_block = p;
p_data->vanuatu_last_dyn_block = p;
}
if (p_data->vanuatu_last_dyn_block->index >= VANUATU_DYN_BLOCK)
{
p = vanuatuCreateDynBlock ();
p_data->vanuatu_last_dyn_block->next = p;
p_data->vanuatu_last_dyn_block = p;
}
p_data->vanuatu_last_dyn_block->type[p_data->
vanuatu_last_dyn_block->index] = type;
p_data->vanuatu_last_dyn_block->ptr[p_data->vanuatu_last_dyn_block->index] =
ptr;
p_data->vanuatu_last_dyn_block->index++;
}
static void
vanuatuMapDynClean (struct vanuatu_data *p_data, void *ptr)
{
int i;
struct vanuatu_dyn_block *p = p_data->vanuatu_first_dyn_block;
while (p)
{
for (i = 0; i < VANUATU_DYN_BLOCK; i++)
{
switch (p->type[i])
{
case VANUATU_DYN_POINT:
case VANUATU_DYN_LINESTRING:
case VANUATU_DYN_POLYGON:
case VANUATU_DYN_RING:
case VANUATU_DYN_GEOMETRY:
if (p->ptr[i] == ptr)
{
p->type[i] = VANUATU_DYN_NONE;
return;
}
break;
};
}
p = p->next;
}
}
static void
vanuatuCleanMapDynAlloc (struct vanuatu_data *p_data, int clean_all)
{
int i;
struct vanuatu_dyn_block *pn;
struct vanuatu_dyn_block *p = p_data->vanuatu_first_dyn_block;
while (p)
{
if (clean_all)
{
for (i = 0; i < VANUATU_DYN_BLOCK; i++)
{
switch (p->type[i])
{
case VANUATU_DYN_POINT:
gaiaFreePoint ((gaiaPointPtr) (p->ptr[i]));
break;
case VANUATU_DYN_LINESTRING:
gaiaFreeLinestring ((gaiaLinestringPtr)
(p->ptr[i]));
break;
case VANUATU_DYN_POLYGON:
gaiaFreePolygon ((gaiaPolygonPtr) (p->ptr[i]));
break;
case VANUATU_DYN_RING:
gaiaFreeRing ((gaiaRingPtr) (p->ptr[i]));
break;
case VANUATU_DYN_GEOMETRY:
gaiaFreeGeomColl ((gaiaGeomCollPtr) (p->ptr[i]));
break;
};
}
}
pn = p->next;
free (p);
p = pn;
}
}
static int
vanuatuCheckValidity (gaiaGeomCollPtr geom)
{
gaiaPointPtr pt;
gaiaLinestringPtr ln;
gaiaPolygonPtr pg;
gaiaRingPtr rng;
int ib;
int entities = 0;
pt = geom->FirstPoint;
while (pt)
{
entities++;
pt = pt->Next;
}
ln = geom->FirstLinestring;
while (ln)
{
if (ln->Points < 2)
return 0;
entities++;
ln = ln->Next;
}
pg = geom->FirstPolygon;
while (pg)
{
rng = pg->Exterior;
if (rng->Points < 4)
return 0;
for (ib = 0; ib < pg->NumInteriors; ib++)
{
rng = pg->Interiors + ib;
if (rng->Points < 4)
return 0;
}
entities++;
pg = pg->Next;
}
if (!entities)
return 0;
return 1;
}
static gaiaGeomCollPtr
gaiaGeometryFromPoint (struct vanuatu_data *p_data, gaiaPointPtr point)
{
gaiaGeomCollPtr geom = NULL;
geom = gaiaAllocGeomColl ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_POINT;
gaiaAddPointToGeomColl (geom, point->X, point->Y);
vanuatuMapDynClean (p_data, point);
gaiaFreePoint (point);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromPointZ (struct vanuatu_data *p_data, gaiaPointPtr point)
{
gaiaGeomCollPtr geom = NULL;
geom = gaiaAllocGeomCollXYZ ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_POINTZ;
gaiaAddPointToGeomCollXYZ (geom, point->X, point->Y, point->Z);
vanuatuMapDynClean (p_data, point);
gaiaFreePoint (point);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromPointM (struct vanuatu_data *p_data, gaiaPointPtr point)
{
gaiaGeomCollPtr geom = NULL;
geom = gaiaAllocGeomCollXYM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_POINTM;
gaiaAddPointToGeomCollXYM (geom, point->X, point->Y, point->M);
vanuatuMapDynClean (p_data, point);
gaiaFreePoint (point);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromPointZM (struct vanuatu_data *p_data, gaiaPointPtr point)
{
gaiaGeomCollPtr geom = NULL;
geom = gaiaAllocGeomCollXYZM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_POINTZM;
gaiaAddPointToGeomCollXYZM (geom, point->X, point->Y, point->Z, point->M);
vanuatuMapDynClean (p_data, point);
gaiaFreePoint (point);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromLinestring (struct vanuatu_data *p_data, gaiaLinestringPtr line)
{
gaiaGeomCollPtr geom = NULL;
gaiaLinestringPtr line2;
int iv;
double x;
double y;
geom = gaiaAllocGeomColl ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_LINESTRING;
line2 = gaiaAddLinestringToGeomColl (geom, line->Points);
for (iv = 0; iv < line2->Points; iv++)
{
gaiaGetPoint (line->Coords, iv, &x, &y);
gaiaSetPoint (line2->Coords, iv, x, y);
}
vanuatuMapDynClean (p_data, line);
gaiaFreeLinestring (line);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromLinestringZ (struct vanuatu_data *p_data,
gaiaLinestringPtr line)
{
gaiaGeomCollPtr geom = NULL;
gaiaLinestringPtr line2;
int iv;
double x;
double y;
double z;
geom = gaiaAllocGeomCollXYZ ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_LINESTRING;
line2 = gaiaAddLinestringToGeomColl (geom, line->Points);
for (iv = 0; iv < line2->Points; iv++)
{
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
gaiaSetPointXYZ (line2->Coords, iv, x, y, z);
}
vanuatuMapDynClean (p_data, line);
gaiaFreeLinestring (line);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromLinestringM (struct vanuatu_data *p_data,
gaiaLinestringPtr line)
{
gaiaGeomCollPtr geom = NULL;
gaiaLinestringPtr line2;
int iv;
double x;
double y;
double m;
geom = gaiaAllocGeomCollXYM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_LINESTRING;
line2 = gaiaAddLinestringToGeomColl (geom, line->Points);
for (iv = 0; iv < line2->Points; iv++)
{
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
gaiaSetPointXYM (line2->Coords, iv, x, y, m);
}
vanuatuMapDynClean (p_data, line);
gaiaFreeLinestring (line);
return geom;
}
static gaiaGeomCollPtr
gaiaGeometryFromLinestringZM (struct vanuatu_data *p_data,
gaiaLinestringPtr line)
{
gaiaGeomCollPtr geom = NULL;
gaiaLinestringPtr line2;
int iv;
double x;
double y;
double z;
double m;
geom = gaiaAllocGeomCollXYZM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_LINESTRING;
line2 = gaiaAddLinestringToGeomColl (geom, line->Points);
for (iv = 0; iv < line2->Points; iv++)
{
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
gaiaSetPointXYZM (line2->Coords, iv, x, y, z, m);
}
vanuatuMapDynClean (p_data, line);
gaiaFreeLinestring (line);
return geom;
}
static gaiaPointPtr
vanuatu_point_xy (struct vanuatu_data *p_data, double *x, double *y)
{
gaiaPointPtr pt = gaiaAllocPoint (*x, *y);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_POINT, pt);
return pt;
}
static gaiaPointPtr
vanuatu_point_xyz (struct vanuatu_data *p_data, double *x, double *y, double *z)
{
gaiaPointPtr pt = gaiaAllocPointXYZ (*x, *y, *z);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_POINT, pt);
return pt;
}
static gaiaPointPtr
vanuatu_point_xym (struct vanuatu_data *p_data, double *x, double *y, double *m)
{
gaiaPointPtr pt = gaiaAllocPointXYM (*x, *y, *m);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_POINT, pt);
return pt;
}
gaiaPointPtr
vanuatu_point_xyzm (struct vanuatu_data * p_data, double *x, double *y,
double *z, double *m)
{
gaiaPointPtr pt = gaiaAllocPointXYZM (*x, *y, *z, *m);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_POINT, pt);
return pt;
}
static gaiaGeomCollPtr
vanuatu_buildGeomFromPoint (struct vanuatu_data *p_data, gaiaPointPtr point)
{
switch (point->DimensionModel)
{
case GAIA_XY:
return gaiaGeometryFromPoint (p_data, point);
case GAIA_XY_Z:
return gaiaGeometryFromPointZ (p_data, point);
case GAIA_XY_M:
return gaiaGeometryFromPointM (p_data, point);
case GAIA_XY_Z_M:
return gaiaGeometryFromPointZM (p_data, point);
}
return NULL;
}
static gaiaLinestringPtr
vanuatu_linestring_xy (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
int points = 0;
int i = 0;
gaiaLinestringPtr linestring;
while (p != NULL)
{
p = p->Next;
points++;
}
linestring = gaiaAllocLinestring (points);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_LINESTRING, linestring);
p = first;
while (p != NULL)
{
gaiaSetPoint (linestring->Coords, i, p->X, p->Y);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
i++;
}
return linestring;
}
static gaiaLinestringPtr
vanuatu_linestring_xyz (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
int points = 0;
int i = 0;
gaiaLinestringPtr linestring;
while (p != NULL)
{
p = p->Next;
points++;
}
linestring = gaiaAllocLinestringXYZ (points);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_LINESTRING, linestring);
p = first;
while (p != NULL)
{
gaiaSetPointXYZ (linestring->Coords, i, p->X, p->Y, p->Z);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
i++;
}
return linestring;
}
static gaiaLinestringPtr
vanuatu_linestring_xym (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
int points = 0;
int i = 0;
gaiaLinestringPtr linestring;
while (p != NULL)
{
p = p->Next;
points++;
}
linestring = gaiaAllocLinestringXYM (points);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_LINESTRING, linestring);
p = first;
while (p != NULL)
{
gaiaSetPointXYM (linestring->Coords, i, p->X, p->Y, p->M);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
i++;
}
return linestring;
}
static gaiaLinestringPtr
vanuatu_linestring_xyzm (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
int points = 0;
int i = 0;
gaiaLinestringPtr linestring;
while (p != NULL)
{
p = p->Next;
points++;
}
linestring = gaiaAllocLinestringXYZM (points);
vanuatuMapDynAlloc (p_data, VANUATU_DYN_LINESTRING, linestring);
p = first;
while (p != NULL)
{
gaiaSetPointXYZM (linestring->Coords, i, p->X, p->Y, p->Z, p->M);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
i++;
}
return linestring;
}
static gaiaGeomCollPtr
vanuatu_buildGeomFromLinestring (struct vanuatu_data *p_data,
gaiaLinestringPtr line)
{
switch (line->DimensionModel)
{
case GAIA_XY:
return gaiaGeometryFromLinestring (p_data, line);
case GAIA_XY_Z:
return gaiaGeometryFromLinestringZ (p_data, line);
case GAIA_XY_M:
return gaiaGeometryFromLinestringM (p_data, line);
case GAIA_XY_Z_M:
return gaiaGeometryFromLinestringZM (p_data, line);
}
return NULL;
}
static int
vanuatu_count_points (gaiaPointPtr first)
{
gaiaPointPtr p = first;
int numpoints = 0;
while (p != NULL)
{
numpoints++;
p = p->Next;
}
return numpoints;
}
static gaiaRingPtr
vanuatu_ring_xy (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaRingPtr ring = NULL;
int numpoints;
int index;
if (first == NULL)
return NULL;
numpoints = vanuatu_count_points (first);
if (numpoints < 4)
return NULL;
ring = gaiaAllocRing (numpoints);
if (ring == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_RING, ring);
p = first;
for (index = 0; index < numpoints; index++)
{
gaiaSetPoint (ring->Coords, index, p->X, p->Y);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return ring;
}
static gaiaRingPtr
vanuatu_ring_xyz (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaRingPtr ring = NULL;
int numpoints;
int index;
if (first == NULL)
return NULL;
numpoints = vanuatu_count_points (first);
if (numpoints < 4)
return NULL;
ring = gaiaAllocRingXYZ (numpoints);
if (ring == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_RING, ring);
p = first;
for (index = 0; index < numpoints; index++)
{
gaiaSetPointXYZ (ring->Coords, index, p->X, p->Y, p->Z);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return ring;
}
static gaiaRingPtr
vanuatu_ring_xym (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaRingPtr ring = NULL;
int numpoints;
int index;
if (first == NULL)
return NULL;
numpoints = vanuatu_count_points (first);
if (numpoints < 4)
return NULL;
ring = gaiaAllocRingXYM (numpoints);
if (ring == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_RING, ring);
p = first;
for (index = 0; index < numpoints; index++)
{
gaiaSetPointXYM (ring->Coords, index, p->X, p->Y, p->M);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return ring;
}
static gaiaRingPtr
vanuatu_ring_xyzm (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaRingPtr ring = NULL;
int numpoints;
int index;
if (first == NULL)
return NULL;
numpoints = vanuatu_count_points (first);
if (numpoints < 4)
return NULL;
ring = gaiaAllocRingXYZM (numpoints);
if (ring == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_RING, ring);
p = first;
for (index = 0; index < numpoints; index++)
{
gaiaSetPointXYZM (ring->Coords, index, p->X, p->Y, p->Z, p->M);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return ring;
}
static gaiaPolygonPtr
vanuatu_polygon_any_type (struct vanuatu_data *p_data, gaiaRingPtr first)
{
gaiaRingPtr p;
gaiaRingPtr p_n;
gaiaPolygonPtr polygon;
if (first == NULL)
return NULL;
polygon = gaiaCreatePolygon (first);
if (polygon == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_POLYGON, polygon);
p = first;
while (p != NULL)
{
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
if (p == first)
gaiaFreeRing (p);
else
gaiaAddRingToPolyg (polygon, p);
p = p_n;
}
return polygon;
}
static gaiaPolygonPtr
vanuatu_polygon_xy (struct vanuatu_data *p_data, gaiaRingPtr first)
{
return vanuatu_polygon_any_type (p_data, first);
}
static gaiaPolygonPtr
vanuatu_polygon_xyz (struct vanuatu_data *p_data, gaiaRingPtr first)
{
return vanuatu_polygon_any_type (p_data, first);
}
static gaiaPolygonPtr
vanuatu_polygon_xym (struct vanuatu_data *p_data, gaiaRingPtr first)
{
return vanuatu_polygon_any_type (p_data, first);
}
static gaiaPolygonPtr
vanuatu_polygon_xyzm (struct vanuatu_data *p_data, gaiaRingPtr first)
{
return vanuatu_polygon_any_type (p_data, first);
}
static gaiaGeomCollPtr
vanuatu_buildGeomFromPolygon (struct vanuatu_data *p_data,
gaiaPolygonPtr polygon)
{
gaiaGeomCollPtr geom = NULL;
if (polygon == NULL)
{
return NULL;
}
switch (polygon->DimensionModel)
{
case GAIA_XY:
geom = gaiaAllocGeomColl ();
break;
case GAIA_XY_Z:
geom = gaiaAllocGeomCollXYZ ();
break;
case GAIA_XY_M:
geom = gaiaAllocGeomCollXYM ();
break;
case GAIA_XY_Z_M:
geom = gaiaAllocGeomCollXYZM ();
break;
}
if (geom == NULL)
{
return NULL;
}
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_POLYGON;
geom->FirstPolygon = polygon;
while (polygon != NULL)
{
vanuatuMapDynClean (p_data, polygon);
geom->LastPolygon = polygon;
polygon = polygon->Next;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipoint_xy (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaGeomCollPtr geom = NULL;
if (first == NULL)
return NULL;
geom = gaiaAllocGeomColl ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOINT;
while (p != NULL)
{
gaiaAddPointToGeomColl (geom, p->X, p->Y);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipoint_xyz (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaGeomCollPtr geom = NULL;
if (first == NULL)
return NULL;
geom = gaiaAllocGeomCollXYZ ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOINT;
while (p != NULL)
{
gaiaAddPointToGeomCollXYZ (geom, p->X, p->Y, p->Z);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipoint_xym (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaGeomCollPtr geom = NULL;
if (first == NULL)
return NULL;
geom = gaiaAllocGeomCollXYM ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOINT;
while (p != NULL)
{
gaiaAddPointToGeomCollXYM (geom, p->X, p->Y, p->M);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipoint_xyzm (struct vanuatu_data *p_data, gaiaPointPtr first)
{
gaiaPointPtr p = first;
gaiaPointPtr p_n;
gaiaGeomCollPtr geom = NULL;
if (first == NULL)
return NULL;
geom = gaiaAllocGeomCollXYZM ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOINT;
while (p != NULL)
{
gaiaAddPointToGeomCollXYZM (geom, p->X, p->Y, p->Z, p->M);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePoint (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multilinestring_xy (struct vanuatu_data *p_data,
gaiaLinestringPtr first)
{
gaiaLinestringPtr p = first;
gaiaLinestringPtr p_n;
gaiaLinestringPtr new_line;
gaiaGeomCollPtr a = gaiaAllocGeomColl ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, a);
a->DeclaredType = GAIA_MULTILINESTRING;
a->DimensionModel = GAIA_XY;
while (p)
{
new_line = gaiaAddLinestringToGeomColl (a, p->Points);
gaiaCopyLinestringCoords (new_line, p);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreeLinestring (p);
p = p_n;
}
return a;
}
static gaiaGeomCollPtr
vanuatu_multilinestring_xyz (struct vanuatu_data *p_data,
gaiaLinestringPtr first)
{
gaiaLinestringPtr p = first;
gaiaLinestringPtr p_n;
gaiaLinestringPtr new_line;
gaiaGeomCollPtr a = gaiaAllocGeomCollXYZ ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, a);
a->DeclaredType = GAIA_MULTILINESTRING;
a->DimensionModel = GAIA_XY_Z;
while (p)
{
new_line = gaiaAddLinestringToGeomColl (a, p->Points);
gaiaCopyLinestringCoords (new_line, p);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreeLinestring (p);
p = p_n;
}
return a;
}
static gaiaGeomCollPtr
vanuatu_multilinestring_xym (struct vanuatu_data *p_data,
gaiaLinestringPtr first)
{
gaiaLinestringPtr p = first;
gaiaLinestringPtr p_n;
gaiaLinestringPtr new_line;
gaiaGeomCollPtr a = gaiaAllocGeomCollXYM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, a);
a->DeclaredType = GAIA_MULTILINESTRING;
a->DimensionModel = GAIA_XY_M;
while (p)
{
new_line = gaiaAddLinestringToGeomColl (a, p->Points);
gaiaCopyLinestringCoords (new_line, p);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreeLinestring (p);
p = p_n;
}
return a;
}
static gaiaGeomCollPtr
vanuatu_multilinestring_xyzm (struct vanuatu_data *p_data,
gaiaLinestringPtr first)
{
gaiaLinestringPtr p = first;
gaiaLinestringPtr p_n;
gaiaLinestringPtr new_line;
gaiaGeomCollPtr a = gaiaAllocGeomCollXYZM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, a);
a->DeclaredType = GAIA_MULTILINESTRING;
a->DimensionModel = GAIA_XY_Z_M;
while (p)
{
new_line = gaiaAddLinestringToGeomColl (a, p->Points);
gaiaCopyLinestringCoords (new_line, p);
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreeLinestring (p);
p = p_n;
}
return a;
}
static gaiaGeomCollPtr
vanuatu_multipolygon_xy (struct vanuatu_data *p_data, gaiaPolygonPtr first)
{
gaiaPolygonPtr p = first;
gaiaPolygonPtr p_n;
int i = 0;
gaiaPolygonPtr new_polyg;
gaiaRingPtr i_ring;
gaiaRingPtr o_ring;
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOLYGON;
while (p)
{
i_ring = p->Exterior;
new_polyg =
gaiaAddPolygonToGeomColl (geom, i_ring->Points, p->NumInteriors);
o_ring = new_polyg->Exterior;
gaiaCopyRingCoords (o_ring, i_ring);
for (i = 0; i < new_polyg->NumInteriors; i++)
{
i_ring = p->Interiors + i;
o_ring = gaiaAddInteriorRing (new_polyg, i, i_ring->Points);
gaiaCopyRingCoords (o_ring, i_ring);
}
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePolygon (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipolygon_xyz (struct vanuatu_data *p_data, gaiaPolygonPtr first)
{
gaiaPolygonPtr p = first;
gaiaPolygonPtr p_n;
int i = 0;
gaiaPolygonPtr new_polyg;
gaiaRingPtr i_ring;
gaiaRingPtr o_ring;
gaiaGeomCollPtr geom = gaiaAllocGeomCollXYZ ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOLYGON;
while (p)
{
i_ring = p->Exterior;
new_polyg =
gaiaAddPolygonToGeomColl (geom, i_ring->Points, p->NumInteriors);
o_ring = new_polyg->Exterior;
gaiaCopyRingCoords (o_ring, i_ring);
for (i = 0; i < new_polyg->NumInteriors; i++)
{
i_ring = p->Interiors + i;
o_ring = gaiaAddInteriorRing (new_polyg, i, i_ring->Points);
gaiaCopyRingCoords (o_ring, i_ring);
}
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePolygon (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipolygon_xym (struct vanuatu_data *p_data, gaiaPolygonPtr first)
{
gaiaPolygonPtr p = first;
gaiaPolygonPtr p_n;
int i = 0;
gaiaPolygonPtr new_polyg;
gaiaRingPtr i_ring;
gaiaRingPtr o_ring;
gaiaGeomCollPtr geom = gaiaAllocGeomCollXYM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOLYGON;
while (p)
{
i_ring = p->Exterior;
new_polyg =
gaiaAddPolygonToGeomColl (geom, i_ring->Points, p->NumInteriors);
o_ring = new_polyg->Exterior;
gaiaCopyRingCoords (o_ring, i_ring);
for (i = 0; i < new_polyg->NumInteriors; i++)
{
i_ring = p->Interiors + i;
o_ring = gaiaAddInteriorRing (new_polyg, i, i_ring->Points);
gaiaCopyRingCoords (o_ring, i_ring);
}
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePolygon (p);
p = p_n;
}
return geom;
}
static gaiaGeomCollPtr
vanuatu_multipolygon_xyzm (struct vanuatu_data *p_data, gaiaPolygonPtr first)
{
gaiaPolygonPtr p = first;
gaiaPolygonPtr p_n;
int i = 0;
gaiaPolygonPtr new_polyg;
gaiaRingPtr i_ring;
gaiaRingPtr o_ring;
gaiaGeomCollPtr geom = gaiaAllocGeomCollXYZM ();
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_MULTIPOLYGON;
while (p)
{
i_ring = p->Exterior;
new_polyg =
gaiaAddPolygonToGeomColl (geom, i_ring->Points, p->NumInteriors);
o_ring = new_polyg->Exterior;
gaiaCopyRingCoords (o_ring, i_ring);
for (i = 0; i < new_polyg->NumInteriors; i++)
{
i_ring = p->Interiors + i;
o_ring = gaiaAddInteriorRing (new_polyg, i, i_ring->Points);
gaiaCopyRingCoords (o_ring, i_ring);
}
p_n = p->Next;
vanuatuMapDynClean (p_data, p);
gaiaFreePolygon (p);
p = p_n;
}
return geom;
}
static void
vanuatu_geomColl_common (struct vanuatu_data *p_data, gaiaGeomCollPtr org,
gaiaGeomCollPtr dst)
{
gaiaGeomCollPtr p = org;
gaiaGeomCollPtr p_n;
gaiaPointPtr pt;
gaiaPointPtr pt_n;
gaiaLinestringPtr ln;
gaiaLinestringPtr ln_n;
gaiaPolygonPtr pg;
gaiaPolygonPtr pg_n;
while (p)
{
pt = p->FirstPoint;
while (pt)
{
pt_n = pt->Next;
pt->Next = NULL;
if (dst->FirstPoint == NULL)
dst->FirstPoint = pt;
if (dst->LastPoint != NULL)
dst->LastPoint->Next = pt;
dst->LastPoint = pt;
pt = pt_n;
}
ln = p->FirstLinestring;
while (ln)
{
ln_n = ln->Next;
ln->Next = NULL;
if (dst->FirstLinestring == NULL)
dst->FirstLinestring = ln;
if (dst->LastLinestring != NULL)
dst->LastLinestring->Next = ln;
dst->LastLinestring = ln;
ln = ln_n;
}
pg = p->FirstPolygon;
while (pg)
{
pg_n = pg->Next;
pg->Next = NULL;
if (dst->FirstPolygon == NULL)
dst->FirstPolygon = pg;
if (dst->LastPolygon != NULL)
dst->LastPolygon->Next = pg;
dst->LastPolygon = pg;
pg = pg_n;
}
p_n = p->Next;
p->FirstPoint = NULL;
p->LastPoint = NULL;
p->FirstLinestring = NULL;
p->LastLinestring = NULL;
p->FirstPolygon = NULL;
p->LastPolygon = NULL;
vanuatuMapDynClean (p_data, p);
gaiaFreeGeomColl (p);
p = p_n;
}
}
static gaiaGeomCollPtr
vanuatu_geomColl_xy (struct vanuatu_data *p_data, gaiaGeomCollPtr first)
{
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_GEOMETRYCOLLECTION;
geom->DimensionModel = GAIA_XY;
vanuatu_geomColl_common (p_data, first, geom);
return geom;
}
static gaiaGeomCollPtr
vanuatu_geomColl_xyz (struct vanuatu_data *p_data, gaiaGeomCollPtr first)
{
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_GEOMETRYCOLLECTION;
geom->DimensionModel = GAIA_XY_Z;
vanuatu_geomColl_common (p_data, first, geom);
return geom;
}
static gaiaGeomCollPtr
vanuatu_geomColl_xym (struct vanuatu_data *p_data, gaiaGeomCollPtr first)
{
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_GEOMETRYCOLLECTION;
geom->DimensionModel = GAIA_XY_M;
vanuatu_geomColl_common (p_data, first, geom);
return geom;
}
static gaiaGeomCollPtr
vanuatu_geomColl_xyzm (struct vanuatu_data *p_data, gaiaGeomCollPtr first)
{
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
if (geom == NULL)
return NULL;
vanuatuMapDynAlloc (p_data, VANUATU_DYN_GEOMETRY, geom);
geom->DeclaredType = GAIA_GEOMETRYCOLLECTION;
geom->DimensionModel = GAIA_XY_Z_M;
vanuatu_geomColl_common (p_data, first, geom);
return geom;
}
#include "vanuatuWkt.c"
#undef yy_accept
#define yy_accept yy_vanuatu_flex_accept
#include "lex.VanuatuWkt.c"
typedef struct vanuatuFlexTokenStruct
{
double value;
struct vanuatuFlexTokenStruct *Next;
} vanuatuFlexToken;
static int
vanuatu_cleanup (vanuatuFlexToken * token)
{
vanuatuFlexToken *ptok;
vanuatuFlexToken *ptok_n;
if (token == NULL)
return 0;
ptok = token;
while (ptok)
{
ptok_n = ptok->Next;
free (ptok);
ptok = ptok_n;
}
return 0;
}
gaiaGeomCollPtr
gaiaParseWkt (const unsigned char *dirty_buffer, short type)
{
void *pParser = ParseAlloc (malloc);
vanuatuFlexToken *tokens = malloc (sizeof (vanuatuFlexToken));
vanuatuFlexToken *head = tokens;
int yv;
yyscan_t scanner;
struct vanuatu_data str_data;
str_data.vanuatu_line = 1;
str_data.vanuatu_col = 1;
str_data.vanuatu_parse_error = 0;
str_data.vanuatu_first_dyn_block = NULL;
str_data.vanuatu_last_dyn_block = NULL;
str_data.result = NULL;
VanuatuWktlex_init_extra (&str_data, &scanner);
tokens->Next = NULL;
VanuatuWkt_scan_string ((char *) dirty_buffer, scanner);
while ((yv = yylex (scanner)) != 0)
{
if (yv == -1)
{
str_data.vanuatu_parse_error = 1;
break;
}
tokens->Next = malloc (sizeof (vanuatuFlexToken));
tokens->Next->Next = NULL;
tokens->Next->value = str_data.VanuatuWktlval.dval;
Parse (pParser, yv, &(tokens->Next->value), &str_data);
tokens = tokens->Next;
}
Parse (pParser, VANUATU_NEWLINE, 0, &str_data);
ParseFree (pParser, free);
VanuatuWktlex_destroy (scanner);
tokens->Next = NULL;
vanuatu_cleanup (head);
if (str_data.vanuatu_parse_error)
{
if (str_data.result != NULL)
{
gaiaFreeGeomColl (str_data.result);
vanuatuCleanMapDynAlloc (&str_data, 0);
}
else
{
vanuatuCleanMapDynAlloc (&str_data, 1);
}
return NULL;
}
vanuatuCleanMapDynAlloc (&str_data, 0);
if (str_data.result == NULL)
return NULL;
if (!vanuatuCheckValidity (str_data.result))
{
gaiaFreeGeomColl (str_data.result);
return NULL;
}
if (type < 0)
;
else
{
if (str_data.result->DeclaredType != type)
{
gaiaFreeGeomColl (str_data.result);
return NULL;
}
}
gaiaMbrGeometry (str_data.result);
return str_data.result;
}
#undef YYNOCODE
#undef YYNSTATE
#undef YYNRULE
#undef YY_SHIFT_MAX
#undef YY_SHIFT_USE_DFLT
#undef YY_REDUCE_USE_DFLT
#undef YY_REDUCE_MAX
#undef YY_FLUSH_BUFFER
#undef YY_DO_BEFORE_ACTION
#undef YY_NUM_RULES
#undef YY_END_OF_BUFFER
#undef YY_END_FILE
#undef YYACTIONTYPE
#undef YY_SZ_ACTTAB
#undef YY_NEW_FILE
#undef BEGIN
#undef YY_START
#undef YY_CURRENT_BUFFER
#undef YY_CURRENT_BUFFER_LVALUE
#undef YY_STATE_BUF_SIZE
#undef YY_DECL
#undef YY_FATAL_ERROR
#undef YYMINORTYPE
#undef YY_CHAR
#undef YYSTYPE
#undef input
#undef ParseAlloc
#undef ParseFree
#undef ParseStackPeak
#undef Parse
#undef yyalloc
#undef yyfree
#undef yyin
#undef yyleng
#undef yyless
#undef yylex
#undef yylineno
#undef yyout
#undef yyrealloc
#undef yyrestart
#undef yyStackEntry
#undef yytext
#undef yywrap
#undef yyzerominor
#undef yy_accept
#undef yy_action
#undef yy_base
#undef yy_buffer_stack
#undef yy_buffer_stack_max
#undef yy_buffer_stack_top
#undef yy_c_buf_p
#undef yy_chk
#undef yy_create_buffer
#undef yy_def
#undef yy_default
#undef yy_delete_buffer
#undef yy_destructor
#undef yy_ec
#undef yy_fatal_error
#undef yy_find_reduce_action
#undef yy_find_shift_action
#undef yy_flex_debug
#undef yy_flush_buffer
#undef yy_get_next_buffer
#undef yy_get_previous_state
#undef yy_init
#undef yy_init_buffer
#undef yy_init_globals
#undef yy_load_buffer
#undef yy_load_buffer_state
#undef yy_lookahead
#undef yy_meta
#undef yy_new_buffer
#undef yy_nxt
#undef yy_parse_failed
#undef yy_pop_parser_stack
#undef yy_reduce
#undef yy_reduce_ofst
#undef yy_set_bol
#undef yy_set_interactive
#undef yy_shift
#undef yy_shift_ofst
#undef yy_start
#undef yy_state_type
#undef yy_switch_to_buffer
#undef yy_syntax_error
#undef yy_trans_info
#undef yy_try_NUL_trans
#undef yyParser
#undef yyStackEntry
#undef yyStackOverflow
#undef yyRuleInfo
#undef yytext_ptr
#undef yyunput
#undef yyzerominor
#undef ParseARG_SDECL
#undef ParseARG_PDECL
#undef ParseARG_FETCH
#undef ParseARG_STORE
#undef REJECT
#undef yymore
#undef YY_MORE_ADJ
#undef YY_RESTORE_YY_MORE_OFFSET
#undef YY_LESS_LINENO
#undef yyTracePrompt
#undef yyTraceFILE
#undef yyTokenName
#undef yyRuleName
#undef ParseTrace
#undef yylex
#undef YY_DECL