serialized_lwgeom = lwgeom_serialize(lwgeom);
/* Output the geometry in WKT and WKB */
- wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom);
+ wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_ALL);
printf("WKT format : %s\n", wkt);
- wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, NDR, &wkb_size);
+ wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_ALL, NDR, &wkb_size);
printf("HEXWKB format : %s\n\n", wkb);
/* Free all of the allocated items */
serialized_lwgeom = lwgeom_serialize(lwgeom);
/* Output the geometry in WKT and WKB */
- wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom);
+ wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_ALL);
printf("WKT format : %s\n", wkt);
- wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, NDR, &wkb_size);
+ wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_ALL, NDR, &wkb_size);
printf("HEXWKB format : %s\n\n", wkb);
/* Free all of the allocated items */
serialized_lwgeom = lwgeom_serialize(lwgeom);
/* Output the geometry in WKT and WKB */
- wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom);
+ wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_NONE);
printf("WKT format : %s\n", wkt);
- wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, NDR, &wkb_size);
+ wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_NONE, NDR, &wkb_size);
printf("HEXWKB format : %s\n\n", wkb);
/* Free all of the allocated items */
#define PARSER_CHECK_ODD 2
#define PARSER_CHECK_CLOSURE 4
+#define PARSER_CHECK_NONE 0
#define PARSER_CHECK_ALL (PARSER_CHECK_MINPOINTS | PARSER_CHECK_ODD | PARSER_CHECK_CLOSURE)
/* Parser access routines */
-extern char *lwgeom_to_ewkt(LWGEOM *lwgeom);
-extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder);
-extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, size_t ewkblen, int flags);
-extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *ewkblen);
+extern char *lwgeom_to_ewkt(LWGEOM *lwgeom, int flags);
+extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder);
+extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen);
+extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *ewkblen);
-extern char *serialized_lwgeom_to_ewkt(uchar *serialized);
+extern char *serialized_lwgeom_to_ewkt(uchar *serialized, int flags);
extern SERIALIZED_LWGEOM *serialized_lwgeom_from_ewkt(char *wkt_input, int flags);
-extern char *serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size);
-extern char *serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size);
+extern char *serialized_lwgeom_to_hexwkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size);
+extern char *serialized_lwgeom_to_ewkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size);
extern void *lwalloc(size_t size);
* Return an alloced string
*/
char *
-lwgeom_to_ewkt(LWGEOM *lwgeom)
+lwgeom_to_ewkt(LWGEOM *lwgeom, int flags)
{
uchar *serialized = lwgeom_serialize(lwgeom);
char *ret;
if ( ! serialized ) {
lwerror("Error serializing geom %p", lwgeom);
}
- ret = unparse_WKT(serialized, lwalloc, lwfree);
+ ret = unparse_WKT(serialized, lwalloc, lwfree, flags);
lwfree(serialized);
return ret;
}
* Return an alloced string
*/
char *
-lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder)
+lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder)
{
uchar *serialized = lwgeom_serialize(lwgeom);
- char *hexwkb = unparse_WKB(serialized, lwalloc, lwfree, byteorder,NULL,1);
+ char *hexwkb = unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder,NULL,1);
lwfree(serialized);
return hexwkb;
}
* Return an alloced string
*/
uchar *
-lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *outsize)
+lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *outsize)
{
uchar *serialized = lwgeom_serialize(lwgeom);
* (last argument set to 0)
*/
uchar *hexwkb = (uchar *)unparse_WKB(serialized, lwalloc, lwfree,
- byteorder, outsize, 0);
+ flags, byteorder, outsize, 0);
lwfree(serialized);
return hexwkb;
}
* - deserialize it
*/
LWGEOM *
-lwgeom_from_ewkb(uchar *ewkb, size_t size, int flags)
+lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size)
{
size_t hexewkblen = size*2;
char *hexewkb;
* Return an alloced string
*/
char *
-serialized_lwgeom_to_ewkt(uchar *serialized)
+serialized_lwgeom_to_ewkt(uchar *serialized, int flags)
{
- return unparse_WKT(serialized, lwalloc, lwfree);
+ return unparse_WKT(serialized, lwalloc, lwfree, flags);
}
/*
* Return an alloced string
*/
char *
-serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size)
+serialized_lwgeom_to_hexwkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size)
{
- return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 1);
+ return unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder, size, 1);
}
/*
* Return an alloced string
*/
char *
-serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size)
+serialized_lwgeom_to_ewkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size)
{
- return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 0);
+ return unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder, size, 0);
}
SERIALIZED_LWGEOM *
parse_it(const char *geometry, int flags, allocator allocfunc, report_error errfunc)
{
- LWDEBUGF(2, "parse_it: %s", geometry);
+ LWDEBUGF(2, "parse_it: %s with parser flags %d", geometry, flags);
local_malloc = allocfunc;
error_func=errfunc;
static uchar endianbyte;
void (*write_wkb_bytes)(uchar* ptr,unsigned int cnt,size_t size);
+/*
+ * Parser global check flags - a bitmap of flags that determine which checks the parser will perform
+ * (see liblwgeom.h for the related PARSER_CHECK constants)
+ */
+int parser_check_flags;
+
/*---------------------------------------------------------- */
+
+
+
/*
* Ensure there is enough space for chars bytes.
* Reallocate memory is this is not the case.
int cnt = read_int(&geom);
/* Ensure that LINESTRING has a minimum of 2 points */
- if (cnt < 2)
+ if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 2)
lwerror("geometry requires more points");
if ( cnt == 0 ){
}
/* Check if they are the same... */
- if (memcmp(&first_point, &last_point, sizeof(double) * dims))
+ if (memcmp(&first_point, &last_point, sizeof(double) * dims) &&
+ (parser_check_flags & PARSER_CHECK_CLOSURE))
lwerror("geometry contains non-closed rings");
}
int cnt = read_int(&geom);
/* Ensure that a CIRCULARSTRING has a minimum of 3 points */
- if (cnt < 3)
+ if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 3)
lwerror("geometry requires more points");
/* Ensure that a CIRCULARSTRING has an odd number of points */
- if (cnt % 2 != 1)
+ if ((parser_check_flags & PARSER_CHECK_ODD) && cnt % 2 != 1)
lwerror("geometry must have an odd number of points");
if ( cnt == 0 ){
}
char *
-unparse_WKT(uchar* serialized, allocator alloc, freeor free)
+unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags)
{
- LWDEBUG(2, "unparse_WKT called.");
+ LWDEBUGF(2, "unparse_WKT called with parser flags %d.", flags);
if (serialized==NULL)
return NULL;
+ /* Setup the inital parser flags */
+ parser_check_flags = flags;
+
local_malloc=alloc;
local_free=free;
len = 128;
LWDEBUGF(2, "output_wkb_line_collection: %d iterations loop", cnt);
/* Ensure that LINESTRING has a minimum of 2 points */
- if (cnt < 2)
+ if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 2)
lwerror("geometry requires more points");
write_wkb_int(cnt);
}
/* Check if they are the same... */
- if (memcmp(&first_point, &last_point, sizeof(double) * dims))
+ if (memcmp(&first_point, &last_point, sizeof(double) * dims) &&
+ (parser_check_flags & PARSER_CHECK_CLOSURE))
lwerror("geometry contains non-closed rings");
return geom;
LWDEBUGF(2, "output_wkb_curve_collection: %d iterations loop", cnt);
/* Ensure that a CIRCULARSTRING has a minimum of 3 points */
- if (cnt < 3)
+ if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 3)
lwerror("geometry requires more points");
/* Ensure that a CIRCULARSTRING has an odd number of points */
- if (cnt % 2 != 1)
+ if ((parser_check_flags & PARSER_CHECK_ODD) && cnt % 2 != 1)
lwerror("geometry must have an odd number of points");
write_wkb_int(cnt);
}
char *
-unparse_WKB(uchar* serialized, allocator alloc, freeor free, char endian, size_t *outsize, uchar hex)
+unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char endian, size_t *outsize, uchar hex)
{
- LWDEBUGF(2, "unparse_WKB(%p,...) called", serialized);
+ LWDEBUGF(2, "unparse_WKB(%p,...) called with parser flags %d", serialized, flags);
if (serialized==NULL)
return NULL;
+ /* Setup the inital parser flags */
+ parser_check_flags = flags;
+
local_malloc=alloc;
local_free=free;
len = 128;
SERIALIZED_LWGEOM* parse_lwg(const char* wkt, int flags, allocator allocfunc,report_error errfunc);
SERIALIZED_LWGEOM* parse_lwgi(const char* wkt, int flags, allocator allocfunc,report_error errfunc);
-char* unparse_WKT(uchar* serialized, allocator alloc,freeor free);
-char* unparse_WKB(uchar* serialized, allocator alloc,freeor free, char endian, size_t *outsize, uchar hexform);
+char* unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags);
+char* unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char endian, size_t *outsize, uchar hexform);
int lwg_parse_yyparse(void);
int lwg_parse_yyerror(char* s);
if ( TYPE_GETTYPE(state->root->type) < MULTIPOINTTYPE )
{
values[0] = "{}";
- values[1] = lwgeom_to_hexwkb(state->root, -1);
+ values[1] = lwgeom_to_hexwkb(state->root, PARSER_CHECK_NONE, -1);
tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);
result = TupleGetDatum(funcctx->slot, tuple);
lwgeom->SRID = state->root->SRID;
values[0] = address;
- values[1] = lwgeom_to_hexwkb(lwgeom, -1);
+ values[1] = lwgeom_to_hexwkb(lwgeom, PARSER_CHECK_NONE, -1);
tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);
result = TupleGetDatum(funcctx->slot, tuple);
node->idx++;
sprintf(address, "{%d}", state->ringnum);
values[0] = address;
- values[1] = lwgeom_to_hexwkb(ringgeom, -1);
+ values[1] = lwgeom_to_hexwkb(ringgeom, PARSER_CHECK_NONE, -1);
MemoryContextSwitchTo(oldcontext);
/*char *semicolonLoc; */
lwgeom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(lwgeom));
+ result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL);
#if 0
semicolonLoc = strchr(result_cstring,';');
else GEOS_setWKBOutputDims(2);
wkb = GEOSGeomToWKB_buf(geom, &size);
- lwgeom = lwgeom_from_ewkb(wkb, size);
+ lwgeom = lwgeom_from_ewkb(wkb, flags, size);
return lwgeom;
}
geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(geom)));
+ POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(geom), PARSER_CHECK_NONE));
geosgeom = POSTGIS2GEOS(geom);
if ( ! geosgeom ) PG_RETURN_NULL();
result = GEOS2POSTGIS(geosgeom, TYPE_HASZ(geom->type));
GEOSGeom_destroy(geosgeom);
- POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(result)));
+ POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(result), PARSER_CHECK_NONE));
PG_FREE_IF_COPY(geom, 0);
/* lwgeom serialized form */
in = (PG_LWGEOM*)PG_DETOAST_DATUM(entry->key);
- POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", serialized_lwgeom_to_ewkt((uchar *)in+VARHDRSZ));
+ POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", serialized_lwgeom_to_ewkt((uchar *)in+VARHDRSZ, PARSER_CHECK_NONE));
if (in == NULL)
{
char *result;
lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, NULL);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL, -1, NULL);
PG_RETURN_CSTRING(result);
}
}
}
- result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), byteorder, &size);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL, byteorder, &size);
text_result = palloc(size+VARHDRSZ);
memcpy(VARDATA(text_result),result,size);
size_t size;
lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, &size);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL, -1, &size);
text_result = palloc(size+VARHDRSZ);
memcpy(VARDATA(text_result),result,size);
wkb_input = (WellKnownBinary *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- lwgeom2 = pglwgeom_from_ewkb((uchar *)VARDATA(wkb_input),
+ lwgeom2 = pglwgeom_from_ewkb((uchar *)VARDATA(wkb_input), PARSER_CHECK_ALL,
VARSIZE(wkb_input)-VARHDRSZ);
if ( ( PG_NARGS()>1) && ( ! PG_ARGISNULL(1) ))
#else /* ndef BINARY_FROM_HEX */
- hexized_wkb = serialized_lwgeom_to_ewkb(SERIALIZED_FORM(lwgeom_input), byteorder, &size);
+ hexized_wkb = serialized_lwgeom_to_ewkb(SERIALIZED_FORM(lwgeom_input), PARSER_CHECK_ALL, byteorder, &size);
size_result = size+VARHDRSZ;
result = palloc(size_result);
POSTGIS_DEBUG(3, "LWGEOM_recv advancing StringInfo buffer");
- POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(result), -1, NULL));
+ POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(result), PARSER_CHECK_NONE, -1, NULL));
/* Set cursor to the end of buffer (so the backend is happy) */
buf->cursor = buf->len;
ogclwgeom = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1(
LWGEOM_force_2d, PointerGetDatum(lwgeom)));
- result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(ogclwgeom));
+ result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(ogclwgeom), PARSER_CHECK_ALL);
semicolonLoc = strchr(result_cstring,';');
* Make a PG_LWGEOM object from a WKB binary representation.
*/
PG_LWGEOM *
-pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen)
+pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen)
{
PG_LWGEOM *ret;
SERIALIZED_LWGEOM *serialized_lwgeom;
}
hexewkb[hexewkblen] = '\0';
- serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, PARSER_CHECK_ALL);
+ serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, flags);
ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ);
SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ);
* Return the EWKB (binary) representation for a PG_LWGEOM.
*/
char *
-pglwgeom_to_ewkb(PG_LWGEOM *geom, char byteorder, size_t *outsize)
+pglwgeom_to_ewkb(PG_LWGEOM *geom, int flags, char byteorder, size_t *outsize)
{
uchar *srl = &(geom->type);
- return serialized_lwgeom_to_ewkb(srl, byteorder, outsize);
+ return serialized_lwgeom_to_ewkb(srl, flags, byteorder, outsize);
}
/*
extern LWGEOM *pglwgeom_deserialize(PG_LWGEOM *pglwgeom);
/* PG_LWGEOM WKB IO */
-extern PG_LWGEOM *pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen);
-extern char *pglwgeom_to_ewkb(PG_LWGEOM *geom, char byteorder, size_t *ewkblen);
+extern PG_LWGEOM *pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen);
+extern char *pglwgeom_to_ewkb(PG_LWGEOM *geom, int flags, char byteorder, size_t *ewkblen);
/* PG_LWGEOM SRID get/set */
extern PG_LWGEOM *pglwgeom_setSRID(PG_LWGEOM *pglwgeom, int32 newSRID);