]> granicus.if.org Git - postgis/commitdiff
With the advent of LWGEOM_PARSER_RESULT, it is now possible to get rid of the horribl...
authorMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Sun, 28 Sep 2008 16:18:12 +0000 (16:18 +0000)
committerMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Sun, 28 Sep 2008 16:18:12 +0000 (16:18 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@3025 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
liblwgeom/lwgeom.c
liblwgeom/lwgparse.c
lwgeom/lwgeom_inout.c
lwgeom/lwgeom_ogc.c
lwgeom/lwgeom_pg.c

index 3105b77f5f19573047c84be60e19a25e0fc5c32c..dc9a1bdf776bc600bc98bf829fc5d670a17bdd61 100644 (file)
@@ -563,18 +563,6 @@ char is_worth_caching_lwgeom_bbox(const LWGEOM *);
  */
 #define SERIALIZED_FORM(x) ((uchar *)VARDATA((x)))
 
-/*
-    This structure is a "glue" structure for returning a serialized
-    LWGEOM from the parser, along with its size. By using a separate
-    type, we remove the constraint that the output from the
-    parser must be PG_LWGEOM format (and hence protect ourselves
-    from future varlena changes)
-*/
-typedef struct serialized_lwgeom {
-    uchar *lwgeom;
-    int size;
-} SERIALIZED_LWGEOM;
-
 /*
  * This function computes the size in bytes
  * of the serialized geometries.
@@ -1133,7 +1121,8 @@ extern void deparse_hex(uchar str, char *result);
  */
 typedef struct struct_lwgeom_parser_result
 {
-       SERIALIZED_LWGEOM *serialized_lwgeom;
+       uchar *serialized_lwgeom;
+       int size;
 } LWGEOM_PARSER_RESULT;
 
 
index 80ef5f7ac08f89fbafa46bc59a7bb9111aa55015..2d23294d49335d1d7b71d0d9d4f556475ba2b632 100644 (file)
@@ -515,7 +515,6 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size)
        long int i;
        int result;
        LWGEOM *ret;
-       SERIALIZED_LWGEOM *serialized_lwgeom;
        LWGEOM_PARSER_RESULT lwg_parser_result;
 
        /* "HEXify" the EWKB */
@@ -530,7 +529,7 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size)
        lwfree(hexewkb);
 
        /* Deserialize */
-       ret = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+       ret = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
 
        return ret;
 }
index e10c055c65a3746e3f2796e44880e8f81b145746..59b2fbdd41d6614a907b19c688d24698deee9d3b 100644 (file)
@@ -155,7 +155,7 @@ void alloc_multisurface(void);
 void alloc_geomertycollection(void);
 void alloc_counter(void);
 void alloc_empty(void);
-SERIALIZED_LWGEOM* make_serialized_lwgeom(void);
+void make_serialized_lwgeom(LWGEOM_PARSER_RESULT *lwg_parser_result);
 uchar strhex_readbyte(const char *in);
 uchar read_wkb_byte(const char **in);
 void read_wkb_bytes(const char **in, uchar* out, int cnt);
@@ -739,19 +739,15 @@ alloc_empty(void)
        st->uu.nn.num=0;
 }
 
-SERIALIZED_LWGEOM *
-make_serialized_lwgeom(void)
+void
+make_serialized_lwgeom(LWGEOM_PARSER_RESULT *lwg_parser_result)
 {
-       SERIALIZED_LWGEOM *out_serialized_lwgeom;
        uchar* out_c;
        output_state out;
        tuple* cur;
        
        LWDEBUG(2, "make_serialized_lwgeom");
 
-       /* Allocate the SERIALIZED_LWGEOM structure */
-       out_serialized_lwgeom = (SERIALIZED_LWGEOM *)local_malloc(sizeof(SERIALIZED_LWGEOM));
-
        /* Allocate the LWGEOM itself */
        out_c = (uchar*)local_malloc(the_geom.alloc_size);
        out.pos = out_c;
@@ -762,11 +758,11 @@ make_serialized_lwgeom(void)
                cur=cur->next;
        }
 
-       /* Setup the SERIALIZED_LWGEOM structure */
-       out_serialized_lwgeom->lwgeom = out_c;
-       out_serialized_lwgeom->size = the_geom.alloc_size;
+       /* Setup the LWGEOM_PARSER_RESULT structure */
+       lwg_parser_result->serialized_lwgeom = out_c;
+       lwg_parser_result->size = the_geom.alloc_size;
 
-       return out_serialized_lwgeom;
+       return;
 }
 
 void
@@ -1150,7 +1146,7 @@ parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char *geometry, int flag
                return 0;
 
        /* Return the parsed geometry */
-       lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom();
+       make_serialized_lwgeom(lwg_parser_result);
 
        return -1;
 }
index 78a7c554e81c39e71993b4cbc357d13510692743..7d9aad6262a424e8a44535e4aae67ccba3b423d1 100644 (file)
@@ -63,7 +63,6 @@ PG_FUNCTION_INFO_V1(LWGEOM_in);
 Datum LWGEOM_in(PG_FUNCTION_ARGS)
 {
        char *str = PG_GETARG_CSTRING(0);
-       SERIALIZED_LWGEOM *serialized_lwgeom;
        LWGEOM_PARSER_RESULT lwg_parser_result;
        LWGEOM *lwgeom; 
        PG_LWGEOM *ret;
@@ -72,8 +71,7 @@ Datum LWGEOM_in(PG_FUNCTION_ARGS)
        /* will handle both HEXEWKB and EWKT */
        result = serialized_lwgeom_from_ewkt(&lwg_parser_result, str, PARSER_CHECK_ALL);
 
-       serialized_lwgeom = lwg_parser_result.serialized_lwgeom;        
-       lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+       lwgeom = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
     
        ret = pglwgeom_serialize(lwgeom);
        lwgeom_release(lwgeom);
@@ -466,7 +464,6 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS)
        /* text */
        text *wkt_input = PG_GETARG_TEXT_P(0);
        PG_LWGEOM *ret;  /*with length */
-       SERIALIZED_LWGEOM *serialized_lwgeom;
        LWGEOM_PARSER_RESULT lwg_parser_result;
        LWGEOM *lwgeom; 
        char *wkt;
@@ -483,8 +480,7 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS)
 
        result = serialized_lwgeom_from_ewkt(&lwg_parser_result, wkt, PARSER_CHECK_ALL);
 
-       serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
-       lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+       lwgeom = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
     
        ret = pglwgeom_serialize(lwgeom);
        lwgeom_release(lwgeom);
index 58cdd7cdcd6e9c656d56894badc24b8dc6eb7c42..799f344d6bc0ca4c6b1751c0e6e8d335fdd135e5 100644 (file)
@@ -966,7 +966,6 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS)
        text *wkttext = PG_GETARG_TEXT_P(0);
        char *wkt, fc;
        size_t size;
-       SERIALIZED_LWGEOM *serialized_lwgeom;
        LWGEOM_PARSER_RESULT lwg_parser_result;
        PG_LWGEOM *geom_result = NULL;
        LWGEOM *lwgeom;
@@ -1006,8 +1005,7 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS)
 
        result = serialized_lwgeom_from_ewkt(&lwg_parser_result, wkt, PARSER_CHECK_ALL);
 
-       serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
-       lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+       lwgeom = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
 
        if ( lwgeom->SRID != -1 || TYPE_GETZM(lwgeom->type) != 0 )
        {
index bf3ce92a4b6aa21cacbfd5368b84c419b885708c..61d55cbc2884cc43e66a53b684c342fe580e2b44 100644 (file)
@@ -245,7 +245,6 @@ PG_LWGEOM *
 pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen)
 {
        PG_LWGEOM *ret;
-       SERIALIZED_LWGEOM *serialized_lwgeom;
        LWGEOM_PARSER_RESULT lwg_parser_result;
        char *hexewkb;
        size_t hexewkblen = ewkblen*2;
@@ -260,10 +259,9 @@ pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen)
 
        result = serialized_lwgeom_from_ewkt(&lwg_parser_result, hexewkb, flags);
 
-       serialized_lwgeom = lwg_parser_result.serialized_lwgeom; 
-       ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ);
-       SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ);
-       memcpy(VARDATA(ret), serialized_lwgeom->lwgeom, serialized_lwgeom->size);
+       ret = (PG_LWGEOM *)palloc(lwg_parser_result.size + VARHDRSZ);
+       SET_VARSIZE(ret, lwg_parser_result.size + VARHDRSZ);
+       memcpy(VARDATA(ret), lwg_parser_result.serialized_lwgeom, lwg_parser_result.size);
 
        lwfree(hexewkb);