[postgis-commits] svn - r2839 - in trunk: liblwgeom lwgeom
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Sun Jul 13 03:50:56 PDT 2008
Author: mcayland
Date: 2008-07-13 03:50:56 -0700 (Sun, 13 Jul 2008)
New Revision: 2839
Modified:
trunk/liblwgeom/liblwgeom.h
trunk/liblwgeom/lwgeom.c
trunk/liblwgeom/lwgeom_api.c
trunk/lwgeom/lwgeom_functions_basic.c
trunk/lwgeom/lwgeom_geos_c.c
trunk/lwgeom/lwgeom_gist.c
trunk/lwgeom/lwgeom_inout.c
trunk/lwgeom/lwgeom_ogc.c
trunk/lwgeom/lwgeom_pg.c
Log:
More work on improving the EWKT/B parser; remove all references to allocator functions from outside of liblwgeom by generating wrapper functions with more meaningful names. As well as cleaning up the API, it also makes the code much more readable
Modified: trunk/liblwgeom/liblwgeom.h
===================================================================
--- trunk/liblwgeom/liblwgeom.h 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/liblwgeom/liblwgeom.h 2008-07-13 10:50:56 UTC (rev 2839)
@@ -1115,15 +1115,17 @@
extern void deparse_hex(uchar str, char *result);
/* Parser access routines */
-extern char *unparse_WKT(uchar* serialized, lwallocator alloc, lwfreeor free);
-extern char *unparse_WKB(uchar* serialized, lwallocator alloc, lwfreeor free, char endian, size_t *outsize, uchar hex);
-
-extern SERIALIZED_LWGEOM *parse_lwgeom_wkt(char *wkt_input);
+extern SERIALIZED_LWGEOM *ewkt_to_lwgeom(char *wkt_input);
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);
extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *ewkblen);
+extern char *serialized_lwgeom_to_ewkt(uchar *serialized);
+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 void *lwalloc(size_t size);
extern void *lwrealloc(void *mem, size_t size);
extern void lwfree(void *mem);
Modified: trunk/liblwgeom/lwgeom.c
===================================================================
--- trunk/liblwgeom/lwgeom.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/liblwgeom/lwgeom.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -452,7 +452,29 @@
}
}
+
/*
+ * Make a LWGEOM object from a WKT input string
+ */
+SERIALIZED_LWGEOM *
+ewkt_to_lwgeom(char *wkt_input)
+{
+ SERIALIZED_LWGEOM *serialized_form = parse_lwg(wkt_input,
+ lwalloc, lwerror);
+
+
+ LWDEBUGF(2, "ewkt_to_lwgeom with %s",wkt_input);
+
+ if (serialized_form == NULL)
+ {
+ lwerror("ewkt_to_lwgeom:: couldnt parse!");
+ return NULL;
+ }
+
+ return serialized_form;
+}
+
+/*
* Return an alloced string
*/
char *
@@ -521,7 +543,7 @@
hexewkb[hexewkblen] = '\0';
/* Rely on grammar parser to construct a LWGEOM */
- serialized_lwgeom = parse_lwgeom_wkt(hexewkb);
+ serialized_lwgeom = ewkt_to_lwgeom(hexewkb);
/* Free intermediate HEXified representation */
lwfree(hexewkb);
@@ -532,7 +554,41 @@
return ret;
}
+
/*
+ * Parser functions for working with serialized LWGEOMs. Useful for cases where
+ * the function input is already serialized, e.g. some input and output functions
+ */
+
+/*
+ * Return an alloced string
+ */
+char *
+serialized_lwgeom_to_ewkt(uchar *serialized)
+{
+ return unparse_WKT(serialized, lwalloc, lwfree);
+}
+
+/*
+ * Return an alloced string
+ */
+char *
+serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size)
+{
+ return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 1);
+}
+
+/*
+ * Return an alloced string
+ */
+char *
+serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size)
+{
+ return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 0);
+}
+
+
+/*
* geom1 same as geom2
* iff
* + have same type
Modified: trunk/liblwgeom/lwgeom_api.c
===================================================================
--- trunk/liblwgeom/lwgeom_api.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/liblwgeom/lwgeom_api.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -2136,25 +2136,7 @@
}
-SERIALIZED_LWGEOM *
-parse_lwgeom_wkt(char *wkt_input)
-{
- SERIALIZED_LWGEOM *serialized_form = parse_lwg(wkt_input,
- lwalloc, lwerror);
-
- LWDEBUGF(2, "parse_lwgeom_wkt with %s",wkt_input);
-
- if (serialized_form == NULL)
- {
- lwerror("parse_WKT:: couldnt parse!");
- return NULL;
- }
-
- return serialized_form;
-
-}
-
/*
* Find interpolation point I
* between point A and point B
Modified: trunk/lwgeom/lwgeom_functions_basic.c
===================================================================
--- trunk/lwgeom/lwgeom_functions_basic.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/lwgeom/lwgeom_functions_basic.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -2910,7 +2910,7 @@
/*char *semicolonLoc; */
lwgeom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result_cstring = unparse_WKT(SERIALIZED_FORM(lwgeom),lwalloc,lwfree);
+ result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(lwgeom));
#if 0
semicolonLoc = strchr(result_cstring,';');
Modified: trunk/lwgeom/lwgeom_geos_c.c
===================================================================
--- trunk/lwgeom/lwgeom_geos_c.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/lwgeom/lwgeom_geos_c.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -3210,7 +3210,7 @@
geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", unparse_WKT(SERIALIZED_FORM(geom), malloc, free));
+ POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(geom)));
geosgeom = POSTGIS2GEOS(geom);
if ( ! geosgeom ) PG_RETURN_NULL();
@@ -3223,7 +3223,7 @@
result = GEOS2POSTGIS(geosgeom, TYPE_HASZ(geom->type));
GEOSGeom_destroy(geosgeom);
- POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", unparse_WKT(SERIALIZED_FORM(result), malloc, free));
+ POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(result)));
PG_FREE_IF_COPY(geom, 0);
Modified: trunk/lwgeom/lwgeom_gist.c
===================================================================
--- trunk/lwgeom/lwgeom_gist.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/lwgeom/lwgeom_gist.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -465,7 +465,7 @@
/* lwgeom serialized form */
in = (PG_LWGEOM*)PG_DETOAST_DATUM(entry->key);
- POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", unparse_WKT(in+VARHDRSZ, malloc, free));
+ POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", serialized_lwgeom_to_ewkt(in+VARHDRSZ));
if (in == NULL)
{
Modified: trunk/lwgeom/lwgeom_inout.c
===================================================================
--- trunk/lwgeom/lwgeom_inout.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/lwgeom/lwgeom_inout.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -68,7 +68,7 @@
PG_LWGEOM *ret;
/* will handle both HEXEWKB and EWKT */
- serialized_lwgeom = parse_lwgeom_wkt(str);
+ serialized_lwgeom = ewkt_to_lwgeom(str);
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
ret = pglwgeom_serialize(lwgeom);
@@ -97,7 +97,7 @@
char *result;
lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree,-1,NULL,1);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, NULL);
PG_RETURN_CSTRING(result);
}
@@ -137,8 +137,7 @@
}
}
- result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree,
- byteorder, &size, 1);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), byteorder, &size);
text_result = palloc(size+VARHDRSZ);
memcpy(VARDATA(text_result),result,size);
@@ -165,7 +164,7 @@
size_t size;
lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree,-1,&size,1);
+ result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, &size);
text_result = palloc(size+VARHDRSZ);
memcpy(VARDATA(text_result),result,size);
@@ -266,8 +265,7 @@
lwgeom_input = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
#ifdef BINARY_FROM_HEX
- hexized_wkb_srid = unparse_WKB(SERIALIZED_FORM(lwgeom_input),
- lwalloc, lwfree, byteorder, &size, 1);
+ hexized_wkb_srid = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom_input), byteorder, &size);
LWDEBUGF(3, "in WKBFromLWGEOM with WKB = '%s'", hexized_wkb_srid);
@@ -296,8 +294,7 @@
#else /* ndef BINARY_FROM_HEX */
- hexized_wkb = unparse_WKB(SERIALIZED_FORM(lwgeom_input),
- lwalloc, lwfree, byteorder, &size, 0);
+ hexized_wkb = serialized_lwgeom_to_ewkb(SERIALIZED_FORM(lwgeom_input), byteorder, &size);
size_result = size+VARHDRSZ;
result = palloc(size_result);
@@ -309,7 +306,7 @@
#ifdef PROFILE
profstop(PROF_QRUN);
- lwnotice("unparse_WKB: prof: %lu", proftime[PROF_QRUN]);
+ lwnotice("serialized_lwgeom_to_ewkb: prof: %lu", proftime[PROF_QRUN]);
#endif
LWDEBUGF(3, "Output size is %lu (comp: %lu)",
@@ -479,7 +476,7 @@
POSTGIS_DEBUGF(3, "in parse_WKT_lwgeom with input: '%s'",wkt);
- serialized_lwgeom = parse_lwgeom_wkt(wkt);
+ serialized_lwgeom = ewkt_to_lwgeom(wkt);
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
ret = pglwgeom_serialize(lwgeom);
@@ -530,7 +527,7 @@
POSTGIS_DEBUG(3, "LWGEOM_recv advancing StringInfo buffer");
- POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free,-1,NULL,1));
+ POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(result), -1, NULL));
/* Set cursor to the end of buffer (so the backend is happy) */
buf->cursor = buf->len;
Modified: trunk/lwgeom/lwgeom_ogc.c
===================================================================
--- trunk/lwgeom/lwgeom_ogc.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/lwgeom/lwgeom_ogc.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -1002,7 +1002,7 @@
POSTGIS_DEBUGF(3, "wkt: [%s]", wkt);
- serialized_lwgeom = parse_lwgeom_wkt(wkt);
+ serialized_lwgeom = ewkt_to_lwgeom(wkt);
lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
if ( lwgeom->SRID != -1 || TYPE_GETZM(lwgeom->type) != 0 )
@@ -1078,7 +1078,7 @@
ogclwgeom = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1(
LWGEOM_force_2d, PointerGetDatum(lwgeom)));
- result_cstring = unparse_WKT(SERIALIZED_FORM(ogclwgeom),lwalloc,lwfree);
+ result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(ogclwgeom));
semicolonLoc = strchr(result_cstring,';');
Modified: trunk/lwgeom/lwgeom_pg.c
===================================================================
--- trunk/lwgeom/lwgeom_pg.c 2008-07-11 10:48:46 UTC (rev 2838)
+++ trunk/lwgeom/lwgeom_pg.c 2008-07-13 10:50:56 UTC (rev 2839)
@@ -264,7 +264,7 @@
}
hexewkb[hexewkblen] = '\0';
- serialized_lwgeom = parse_lwgeom_wkt(hexewkb);
+ serialized_lwgeom = ewkt_to_lwgeom(hexewkb);
ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ);
SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ);
@@ -282,8 +282,7 @@
pglwgeom_to_ewkb(PG_LWGEOM *geom, char byteorder, size_t *outsize)
{
uchar *srl = &(geom->type);
- return unparse_WKB(srl, lwalloc, lwfree,
- byteorder, outsize, 0);
+ return serialized_lwgeom_to_ewkb(srl, byteorder, outsize);
}
/*
More information about the postgis-commits
mailing list