Commit a6a0bbc5 authored by Mark Cave-Ayland's avatar Mark Cave-Ayland
Browse files

Add parser flags to the LWGEOM to (E)WKB/WKT parsers, similar to has already...

Add parser flags to the LWGEOM to (E)WKB/WKT parsers, similar to has already been done for the (E)WKB/WKT to LWGEOM parsers.


git-svn-id: http://svn.osgeo.org/postgis/trunk@3012 b70326c6-7e19-0410-871a-916f4a2858ee
parent b7dfc24a
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -69,9 +69,9 @@ int main()
	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 */
@@ -105,9 +105,9 @@ int main()
	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 */
@@ -177,9 +177,9 @@ int main()
	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 */
+8 −7
Original line number Diff line number Diff line
@@ -1125,19 +1125,20 @@ extern void deparse_hex(uchar str, char *result);
#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);
+13 −13
Original line number Diff line number Diff line
@@ -457,14 +457,14 @@ lwgeom_add(const LWGEOM *to, uint32 where, const LWGEOM *what)
 * 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;
}
@@ -473,10 +473,10 @@ lwgeom_to_ewkt(LWGEOM *lwgeom)
 * 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;
}
@@ -485,7 +485,7 @@ lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder)
 * 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);

@@ -495,7 +495,7 @@ lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *outsize)
	 * (last argument set to 0)
	 */
	uchar *hexwkb = (uchar *)unparse_WKB(serialized, lwalloc, lwfree,
		byteorder, outsize, 0);
		flags, byteorder, outsize, 0);
	lwfree(serialized);
	return hexwkb;
}
@@ -508,7 +508,7 @@ lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *outsize)
 *	- 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;
@@ -564,27 +564,27 @@ serialized_lwgeom_from_ewkt(char *wkt_input, int flags)
 * 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);
}


+1 −1
Original line number Diff line number Diff line
@@ -1129,7 +1129,7 @@ alloc_wkb(const char *parser)
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;
+29 −12
Original line number Diff line number Diff line
@@ -75,10 +75,19 @@ static int lwgi;
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.
@@ -230,7 +239,7 @@ output_line_collection(uchar* geom,outfunc func,int supress)
	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 ){
@@ -294,7 +303,8 @@ output_polygon_ring_collection(uchar* geom,outfunc func,int supress)
       	 	}

        	/* 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");

	}
@@ -308,11 +318,11 @@ output_curve_collection(uchar* geom,outfunc func,int supress)
	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 ){
@@ -556,14 +566,17 @@ output_wkt(uchar* geom, int supress)
}

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;
@@ -687,7 +700,7 @@ output_wkb_line_collection(uchar* geom,outwkbfunc func)
	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);
@@ -733,7 +746,8 @@ output_wkb_polygon_ring_collection(uchar* geom,outwkbfunc func)
	}

	/* 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;
@@ -757,11 +771,11 @@ output_wkb_curve_collection(uchar* geom,outwkbfunc func)
	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);
@@ -860,13 +874,16 @@ output_wkb(uchar* geom)
}

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;
Loading