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

Update LWGEOM unparser to (E)WKT/WKB to resturn a LWGEOM_UNPARSER_RESULT...

Update LWGEOM unparser to (E)WKT/WKB to resturn a LWGEOM_UNPARSER_RESULT structure instead of just the WKT/WKB character array. This is the same work done for r3023 but applied to the unparser instead.


git-svn-id: http://svn.osgeo.org/postgis/trunk@3026 b70326c6-7e19-0410-871a-916f4a2858ee
parent 137120a0
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -39,10 +39,11 @@ int main()
	/*
	 * An example to show how to call the WKT/WKB unparsers in liblwgeom
	 */
	LWGEOM_UNPARSER_RESULT lwg_unparser_result;
	int result;

	LWGEOM *lwgeom;
	uchar *serialized_lwgeom, *wkt, *wkb;
	size_t wkb_size;	
	uchar *serialized_lwgeom;

	POINTARRAY *pa;
	POINT2D point2d;
@@ -69,14 +70,13 @@ int main()
	serialized_lwgeom = lwgeom_serialize(lwgeom); 

	/* Output the geometry in WKT and WKB */
	wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_ALL);
	printf("WKT format    : %s\n", wkt);
	wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_ALL, NDR, &wkb_size);
	printf("HEXWKB format : %s\n\n", wkb); 
	result = serialized_lwgeom_to_ewkt(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_ALL);
	printf("WKT format    : %s\n", lwg_unparser_result.wkoutput);
	result = serialized_lwgeom_to_hexwkb(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_ALL, NDR);
	printf("HEXWKB format : %s\n\n", lwg_unparser_result.wkoutput); 

	/* Free all of the allocated items */
	lwfree(wkb);
	lwfree(wkt);
	lwfree(lwg_unparser_result.wkoutput);
	lwfree(serialized_lwgeom);
	pfree_point(testpoint);

@@ -105,14 +105,13 @@ int main()
	serialized_lwgeom = lwgeom_serialize(lwgeom); 

	/* Output the geometry in WKT and WKB */
	wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_ALL);
	printf("WKT format    : %s\n", wkt);
	wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_ALL, NDR, &wkb_size);
	printf("HEXWKB format : %s\n\n", wkb); 
	result = serialized_lwgeom_to_ewkt(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_ALL);
	printf("WKT format    : %s\n", lwg_unparser_result.wkoutput);
	result = serialized_lwgeom_to_hexwkb(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_ALL, NDR);
	printf("HEXWKB format : %s\n\n", lwg_unparser_result.wkoutput); 

	/* Free all of the allocated items */
	lwfree(wkb);
	lwfree(wkt);
	lwfree(lwg_unparser_result.wkoutput);
	lwfree(serialized_lwgeom);
	pfree_line(testline);

@@ -177,14 +176,13 @@ int main()
	serialized_lwgeom = lwgeom_serialize(lwgeom); 

	/* Output the geometry in WKT and WKB */
	wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_NONE);
	printf("WKT format    : %s\n", wkt);
	wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_NONE, NDR, &wkb_size);
	printf("HEXWKB format : %s\n\n", wkb); 
	result = serialized_lwgeom_to_ewkt(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_NONE);
	printf("WKT format    : %s\n", lwg_unparser_result.wkoutput);
	result = serialized_lwgeom_to_hexwkb(&lwg_unparser_result, serialized_lwgeom, PARSER_CHECK_NONE, NDR);
	printf("HEXWKB format : %s\n\n", lwg_unparser_result.wkoutput); 

	/* Free all of the allocated items */
	lwfree(wkb);
	lwfree(wkt);
	lwfree(lwg_unparser_result.wkoutput);
	lwfree(serialized_lwgeom);
	pfree_polygon(testpoly);
}
+13 −5
Original line number Diff line number Diff line
@@ -1121,10 +1121,18 @@ extern void deparse_hex(uchar str, char *result);
 */
typedef struct struct_lwgeom_parser_result
{
	uchar *serialized_lwgeom;
	int size;
	uchar *serialized_lwgeom;	/* Pointer to serialized LWGEOM */
	int size;			/* Size of serialized LWGEOM in bytes */
} LWGEOM_PARSER_RESULT;

/*
 * Unparser result structure: returns the result of attempting to convert LWGEOM to (E)WKT/(E)WKB 
 */
typedef struct struct_lwgeom_unparser_result
{
	char *wkoutput;			/* Pointer to WKT or WKB output */
	int size;			/* Size of serialized LWGEOM in bytes */
} LWGEOM_UNPARSER_RESULT;

/* Parser access routines */
extern char *lwgeom_to_ewkt(LWGEOM *lwgeom, int flags);
@@ -1132,10 +1140,10 @@ 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, int flags);
extern int serialized_lwgeom_to_ewkt(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags);
extern int serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_input, int flags);
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 int serialized_lwgeom_to_hexwkb(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags, unsigned int byteorder);
extern int serialized_lwgeom_to_ewkb(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags, unsigned int byteorder);


extern void *lwalloc(size_t size);
+39 −17
Original line number Diff line number Diff line
@@ -459,14 +459,18 @@ lwgeom_add(const LWGEOM *to, uint32 where, const LWGEOM *what)
char *
lwgeom_to_ewkt(LWGEOM *lwgeom, int flags)
{
	LWGEOM_UNPARSER_RESULT lwg_unparser_result;
	uchar *serialized = lwgeom_serialize(lwgeom);
	char *ret;
	int result;

	if ( ! serialized ) {
		lwerror("Error serializing geom %p", lwgeom);
	}
	ret = unparse_WKT(serialized, lwalloc, lwfree, flags);

	result = unparse_WKT(&lwg_unparser_result, serialized, lwalloc, lwfree, flags);
	lwfree(serialized);
	return ret;

	return lwg_unparser_result.wkoutput;
}

/*
@@ -475,10 +479,14 @@ lwgeom_to_ewkt(LWGEOM *lwgeom, int flags)
char *
lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder)
{
	LWGEOM_UNPARSER_RESULT lwg_unparser_result;
	uchar *serialized = lwgeom_serialize(lwgeom);
	char *hexwkb = unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder,NULL,1);
	int result;

	result = unparse_WKB(&lwg_unparser_result, serialized, lwalloc, lwfree, flags, byteorder,1);

	lwfree(serialized);
	return hexwkb;
	return lwg_unparser_result.wkoutput;
}

/*
@@ -487,17 +495,19 @@ lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder)
uchar *
lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *outsize)
{
	LWGEOM_UNPARSER_RESULT lwg_unparser_result;
	uchar *serialized = lwgeom_serialize(lwgeom);
	int result;

	/*
	 * We cast return to "unsigned" char as we are
	 * requesting a "binary" output, not HEX
	 * (last argument set to 0)
	 */
	uchar *hexwkb = (uchar *)unparse_WKB(serialized, lwalloc, lwfree,
		flags, byteorder, outsize, 0);
	result = unparse_WKB(&lwg_unparser_result, serialized, lwalloc, lwfree,
		flags, byteorder, 0);
	lwfree(serialized);
	return hexwkb;
	return (uchar *)lwg_unparser_result.wkoutput;
}

/*
@@ -558,28 +568,40 @@ serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_i
/*
 * Return an alloced string
 */
char *
serialized_lwgeom_to_ewkt(uchar *serialized, int flags)
int
serialized_lwgeom_to_ewkt(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags)
{
	return unparse_WKT(serialized, lwalloc, lwfree, flags);
	int result;

	result = unparse_WKT(lwg_unparser_result, serialized, lwalloc, lwfree, flags);

	return result;
}

/*
 * Return an alloced string
 */
char *
serialized_lwgeom_to_hexwkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size)
int
serialized_lwgeom_to_hexwkb(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags, unsigned int byteorder)
{
	return unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder, size, 1);
	int result;

	result = unparse_WKB(lwg_unparser_result, serialized, lwalloc, lwfree, flags, byteorder, 1);

	return result;
}

/*
 * Return an alloced string
 */
char *
serialized_lwgeom_to_ewkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size)
int
serialized_lwgeom_to_ewkb(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags, unsigned int byteorder)
{
	return unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder, size, 0);
	int result;

	result = unparse_WKB(lwg_unparser_result, serialized, lwalloc, lwfree, flags, byteorder, 0);

	return result;
}


+1 −0
Original line number Diff line number Diff line
@@ -1135,6 +1135,7 @@ parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char *geometry, int flag
	/* Setup the inital parser flags and empty the return struct */
	parser_check_flags = flags;
	lwg_parser_result->serialized_lwgeom = NULL;
	lwg_parser_result->size = 0;

	init_parser(geometry);

+29 −13
Original line number Diff line number Diff line
@@ -44,7 +44,6 @@ uchar* output_line_collection(uchar* geom,outfunc func,int supress);
uchar* output_polygon_collection(uchar* geom,int suppress);
uchar* output_polygon_ring_collection(uchar* geom,outfunc func,int supress);
uchar* output_curve_collection(uchar* geom,outfunc func,int supress);
uchar* output_collection_2(uchar* geom,int suppress);
uchar* output_multipoint(uchar* geom,int suppress);
uchar* output_compound(uchar* geom, int suppress);
uchar* output_multisurface(uchar* geom, int suppress);
@@ -81,6 +80,11 @@ void (*write_wkb_bytes)(uchar* ptr,unsigned int cnt,size_t size);
 */
int unparser_check_flags;

/*
 * Unparser result structure
 */
LWGEOM_UNPARSER_RESULT *unparser_result;

/*---------------------------------------------------------- */


@@ -565,18 +569,21 @@ output_wkt(uchar* geom, int supress)
	return geom;
}

char *
unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags)
int
unparse_WKT(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar* serialized, allocator alloc, freeor free, int flags)
{

        LWDEBUGF(2, "unparse_WKT called with parser flags %d.", flags);

	if (serialized==NULL)
		return NULL;
		return 0;

	/* Setup the inital parser flags */
	/* Setup the inital parser flags and empty the return struct */
        unparser_check_flags = flags;
	lwg_unparser_result->wkoutput = NULL;
        lwg_unparser_result->size = 0;

	unparser_result = lwg_unparser_result;
	local_malloc=alloc;
	local_free=free;
	len = 128;
@@ -585,7 +592,11 @@ unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags)

	output_wkt(serialized, 0);

	return out_start;
	/* Store the result in the struct */
	lwg_unparser_result->wkoutput = out_start;
	lwg_unparser_result->size = strlen(out_start);

	return -1;
}

static char outchr[]={"0123456789ABCDEF" };
@@ -873,17 +884,20 @@ output_wkb(uchar* geom)
	return geom;
}

char *
unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char endian, size_t *outsize, uchar hex)
int
unparse_WKB(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar* serialized, allocator alloc, freeor free, int flags, char endian, uchar hex)
{
	LWDEBUGF(2, "unparse_WKB(%p,...) called with parser flags %d", serialized, flags);

	if (serialized==NULL)
		return NULL;
	if (serialized==0)
		return 0;

	/* Setup the inital parser flags */
	/* Setup the inital parser flags and empty the return struct */
        unparser_check_flags = flags;
	lwg_unparser_result->wkoutput = NULL;
	lwg_unparser_result->size = 0;

	unparser_result = lwg_unparser_result;
	local_malloc=alloc;
	local_free=free;
	len = 128;
@@ -918,9 +932,11 @@ unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char end
		*out_pos=0;
	}

	if ( outsize ) *outsize = (out_pos-out_start);
	/* Store the result in the struct */	
	lwg_unparser_result->wkoutput = out_start;
	lwg_unparser_result->size = (out_pos-out_start);

	return out_start;
	return -1;	
}


Loading