]> granicus.if.org Git - postgis/commitdiff
More work on improving the EWKT/B parser; remove all references to allocator function...
authorMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Sun, 13 Jul 2008 10:50:56 +0000 (10:50 +0000)
committerMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Sun, 13 Jul 2008 10:50:56 +0000 (10:50 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@2839 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
liblwgeom/lwgeom.c
liblwgeom/lwgeom_api.c
lwgeom/lwgeom_functions_basic.c
lwgeom/lwgeom_geos_c.c
lwgeom/lwgeom_gist.c
lwgeom/lwgeom_inout.c
lwgeom/lwgeom_ogc.c
lwgeom/lwgeom_pg.c

index 4067b871fa7c0879573f07d143d0ea5fb90c52e3..1be0a2b3453a9c289dfa9740a13dfa411aa9df49 100644 (file)
@@ -1115,15 +1115,17 @@ extern uchar parse_hex(char *str);
 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);
index a6972b5818f864a670bc253837b890bce755860a..61f7f838d1837b0e441834ae7744cfce428894a6 100644 (file)
@@ -452,6 +452,28 @@ lwgeom_add(const LWGEOM *to, uint32 where, const LWGEOM *what)
        }
 }
 
+
+/*
+ * 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
  */
@@ -521,7 +543,7 @@ lwgeom_from_ewkb(uchar *ewkb, size_t size)
        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,6 +554,40 @@ lwgeom_from_ewkb(uchar *ewkb, size_t size)
        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
index 066ee9863c01b884a71f7514522347bd298a6a09..030b213028ce7d9aa299afbfd640eba302ef7eb7 100644 (file)
@@ -2136,24 +2136,6 @@ deparse_hex(uchar str, char *result)
 
 }
 
-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
index 474dc786bd2d922565ccefe9a2a4e7014024a569..b727d0cff3f69148fd63be0645fdc472b24f6f12 100644 (file)
@@ -2910,7 +2910,7 @@ Datum LWGEOM_asEWKT(PG_FUNCTION_ARGS)
        /*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,';');
index 06f8d514ae575e42b7e3eac817100a2366babc66..79db62f55efdf3b80d9b20792cc26b19ccda98d6 100644 (file)
@@ -3210,7 +3210,7 @@ Datum GEOSnoop(PG_FUNCTION_ARGS)
 
        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 @@ Datum GEOSnoop(PG_FUNCTION_ARGS)
        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);
 
index c69666026e2c4adf5a6781bbafca9474530d49e9..6879c606142b5da128c729fb8f03dd47cae0ac14 100644 (file)
@@ -465,7 +465,7 @@ Datum LWGEOM_gist_compress(PG_FUNCTION_ARGS)
                        /* 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)
                        {
index 8e75a7f633323aa4f2b8cec3c1936651460b9a96..19dc3bd58575ebd29f09b90e40d737e54693e9d3 100644 (file)
@@ -68,7 +68,7 @@ Datum LWGEOM_in(PG_FUNCTION_ARGS)
     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 @@ Datum LWGEOM_out(PG_FUNCTION_ARGS)
        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 @@ Datum LWGEOM_asHEXEWKB(PG_FUNCTION_ARGS)
                }
        }
 
-       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 @@ Datum LWGEOM_to_text(PG_FUNCTION_ARGS)
        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 @@ Datum WKBFromLWGEOM(PG_FUNCTION_ARGS)
        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 @@ Datum WKBFromLWGEOM(PG_FUNCTION_ARGS)
 
 #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 @@ Datum WKBFromLWGEOM(PG_FUNCTION_ARGS)
 
 #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 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS)
 
        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 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS)
 
        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;
index 51195282d90e9cde3bb908b4454b3b95023c5234..0c882b331523b65b4a1c9fcd1d016bce72b0d4f4 100644 (file)
@@ -1002,7 +1002,7 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS)
 
        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 @@ Datum LWGEOM_asText(PG_FUNCTION_ARGS)
        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,';');
 
index febf88feff95cfe711d1142ac9bbcd3d10185bfc..31c7f13975f274efb1708a4bfeba10a5d6922cd6 100644 (file)
@@ -264,7 +264,7 @@ pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen)
        }
        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 @@ char *
 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);
 }
 
 /*