]> granicus.if.org Git - postgis/commitdiff
Bug fix in size computation.
authorSandro Santilli <strk@keybit.net>
Tue, 5 Oct 2004 17:15:42 +0000 (17:15 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 5 Oct 2004 17:15:42 +0000 (17:15 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@930 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/liblwgeom.h
lwgeom/lwgeom_api.c
lwgeom/lwgeom_functions_basic.c
lwgeom/lwline.c
lwgeom/lwpoint.c
lwgeom/lwpoly.c

index 58dd4af4e7419ed26166a300ad1c7291d0a016fb..959efd1d3dcd889db6bee3425c0c35816eda2d6d 100644 (file)
@@ -3,8 +3,8 @@
 
 //liblwgeom.h
 
-#define DEBUG 1
-#define DEBUG_CALLS 1
+//#define DEBUG 1
+//#define DEBUG_CALLS 1
 
 
 typedef void* (*lwallocator)(size_t size);
@@ -387,11 +387,11 @@ extern PG_LWGEOM *PG_LWGEOM_construct(char *serialized, int SRID, int wantbbox);
  * This function computes the size in bytes
  * of the serialized geometries.
  */
-extern uint32 lwgeom_size(const char *serialized_form);
-extern uint32 lwgeom_size_subgeom(const char *serialized_form, int geom_number);
-extern uint32 lwgeom_size_line(const char *serialized_line);
-extern uint32 lwgeom_size_point(const char *serialized_point);
-extern uint32 lwgeom_size_poly(const char *serialized_line);
+extern size_t lwgeom_size(const char *serialized_form);
+extern size_t lwgeom_size_subgeom(const char *serialized_form, int geom_number);
+extern size_t lwgeom_size_line(const char *serialized_line);
+extern size_t lwgeom_size_point(const char *serialized_point);
+extern size_t lwgeom_size_poly(const char *serialized_line);
 
 
 //--------------------------------------------------------
index 483f094afcaade363aa5509341c2d1b82dfaab03..bc729d16a6856c1a07f342f7a3744ae36f8257aa 100644 (file)
@@ -888,77 +888,6 @@ get_int32(const char *loc)
 
 
 
-//********************************************************************
-// support for the LWPOINT sub-type
-
-
-
-//find length of this serialized point
-uint32
-lwgeom_size_point(const char *serialized_point)
-{
-       uint32  result = 1;
-       unsigned char type;
-       const char *loc;
-
-       type = (unsigned char) serialized_point[0];
-
-       if ( lwgeom_getType(type) != POINTTYPE) return 0;
-
-#ifdef DEBUG
-lwnotice("lwgeom_size_point called (%d)", result);
-#endif
-
-       loc = serialized_point+1;
-
-       if (lwgeom_hasBBOX(type))
-       {
-               loc += sizeof(BOX2DFLOAT4);
-               result +=sizeof(BOX2DFLOAT4);
-#ifdef DEBUG
-lwnotice("lwgeom_size_point: has bbox (%d)", result);
-#endif
-       }
-
-       if ( lwgeom_hasSRID(type))
-       {
-#ifdef DEBUG
-lwnotice("lwgeom_size_point: has srid (%d)", result);
-#endif
-               loc +=4; // type + SRID
-               result +=4;
-       }
-
-       if (lwgeom_ndims(type) == 3)
-       {
-#ifdef DEBUG
-lwnotice("lwgeom_size_point: returning (%d)", result+24);
-#endif
-               return result + 24;
-       }
-       else if (lwgeom_ndims(type) == 2)
-       {
-#ifdef DEBUG
-lwnotice("lwgeom_size_point: returning (%d)", result+16);
-#endif
-               return result + 16;
-       }
-       else if (lwgeom_ndims(type) == 4)
-       {
-#ifdef DEBUG
-lwnotice("lwgeom_size_point: returning (%d)", result+32);
-#endif
-               return result + 32;
-       }
-
-       lwerror("lwgeom_size_point :: invalid ndims = %i",
-               lwgeom_ndims(type));
-       return 0; //never get here
-}
-
-
-
-
 //*************************************************************************
 // multi-geometry support
 // note - for a simple type (ie. point), this will have sub_geom[0] = serialized_form.
@@ -1449,7 +1378,7 @@ lwgeom_constructempty_buf(int SRID, char hasz, char hasm, char *buf, int *retsiz
 //         --> size of the point
 
 // take a geometry, and find its length
-uint32
+size_t
 lwgeom_size(const char *serialized_form)
 {
        unsigned char type = lwgeom_getType((unsigned char) serialized_form[0]);
@@ -1544,7 +1473,7 @@ lwgeom_size(const char *serialized_form)
        return result;
 }
 
-uint32
+size_t
 lwgeom_size_subgeom(const char *serialized_form, int geom_number)
 {
        if (geom_number == -1)
index a8514fd340bff36d53ee7e98248a00d05fa40477..56ecbff01692c1d4168fac82881860c30e1388d9 100644 (file)
@@ -1568,12 +1568,9 @@ elog(NOTICE, "lwgeom_force3dm_recursive: %d bytes pointlist allocated", sizeof(P
 
                loc = newpts.serialized_pointlist;
                check = TYPE_NDIMS(line->points->dims);
-               lwnotice("line->points ndims: %d", check);
                for (j=0; j<line->points->npoints; j++)
                {
-                       lwnotice("line->points ndims: %d", check);
                        getPoint3dm_p(line->points, j, (POINT3DM *)loc);
-                       lwnotice("line->points ndims: %d", check);
                        if ( check != TYPE_NDIMS(line->points->dims) )
                        {
                                lwerror("getPoint3dm_p messed with input pointarray");
@@ -1954,6 +1951,11 @@ Datum LWGEOM_force_3dm(PG_FUNCTION_ARGS)
        lwgeom_force3dm_recursive(SERIALIZED_FORM(geom),
                SERIALIZED_FORM(result), &size);
 
+#ifdef DEBUG
+       lwnotice("lwgeom_force3dm_recursive returned a %d sized geom",
+               size);
+#endif
+
        // we can safely avoid this... memory will be freed at
        // end of query processing anyway.
        //result = lwrealloc(result, size+4);
index 87a6a6a5ebde3bac259e46be0d7366bab575c9d9..29722aca00325791fd6758fea0fb22c5b83c019c 100644 (file)
@@ -112,7 +112,6 @@ lwline_serialize(LWLINE *line)
 void
 lwline_serialize_buf(LWLINE *line, char *buf, size_t *retsize)
 {
-       size_t size=1;  // type byte
        char hasSRID;
        char *loc;
        int ptsize = pointArray_ptsize(line->points);
@@ -157,8 +156,8 @@ lwline_serialize_buf(LWLINE *line, char *buf, size_t *retsize)
 #endif
        }
 
-       memcpy(loc, &line->points->npoints, sizeof(int32));
-       loc +=4;
+       memcpy(loc, &line->points->npoints, sizeof(uint32));
+       loc += sizeof(uint32);
 
 #ifdef DEBUG
        lwnotice("lwline_serialize_buf added npoints (%d)",
@@ -168,7 +167,7 @@ lwline_serialize_buf(LWLINE *line, char *buf, size_t *retsize)
        //copy in points
        memcpy(loc, line->points->serialized_pointlist,
                ptsize*line->points->npoints);
-       loc += ptsize * line->points->npoints;
+       loc += ptsize*line->points->npoints;
 
 #ifdef DEBUG
        lwnotice("lwline_serialize_buf copied serialized_pointlist (%d bytes)",
@@ -211,8 +210,8 @@ lwline_serialize_size(LWLINE *line)
        if ( line->SRID != -1 ) size += 4; // SRID
        if ( TYPE_HASBBOX(line->type) ) size += sizeof(BOX2DFLOAT4);
 
-       size += pointArray_ptsize(line->points)*line->points->npoints;;
        size += 4; // npoints
+       size += pointArray_ptsize(line->points)*line->points->npoints;
 
 #ifdef DEBUG_CALLS
        lwnotice("lwline_serialize_size returning %d", size);
@@ -221,14 +220,14 @@ lwline_serialize_size(LWLINE *line)
        return size;
 }
 
-void pfree_line     (LWLINE  *line)
+void pfree_line (LWLINE  *line)
 {
        lwfree(line->points);
        lwfree(line);
 }
 
 // find length of this serialized line
-uint32
+size_t
 lwgeom_size_line(const char *serialized_line)
 {
        int type = (unsigned char) serialized_line[0];
@@ -262,7 +261,7 @@ lwgeom_size_line(const char *serialized_line)
        npoints = get_uint32(loc);
        result += sizeof(uint32); //npoints
 
-       result +=  TYPE_NDIMS(type) * sizeof(double);
+       result += TYPE_NDIMS(type) * sizeof(double) * npoints;
 
 #ifdef DEBUG_CALLS
        lwnotice("lwgeom_size_line returning %d", result);
index 6f701caa9dfbfe8d3ed8e2b9df054a5c4391b8e1..15e1f4f23ad2c3d3e0fcf5411e48f321b33e7421 100644 (file)
@@ -311,3 +311,47 @@ lwpoint_add(const LWPOINT *to, uint32 where, const LWGEOM *what)
        
        return (LWGEOM *)col;
 }
+
+//find length of this serialized point
+size_t
+lwgeom_size_point(const char *serialized_point)
+{
+       uint32  result = 1;
+       unsigned char type;
+       const char *loc;
+
+       type = (unsigned char) serialized_point[0];
+
+       if ( lwgeom_getType(type) != POINTTYPE) return 0;
+
+#ifdef DEBUG
+lwnotice("lwgeom_size_point called (%d)", result);
+#endif
+
+       loc = serialized_point+1;
+
+       if (lwgeom_hasBBOX(type))
+       {
+               loc += sizeof(BOX2DFLOAT4);
+               result +=sizeof(BOX2DFLOAT4);
+#ifdef DEBUG
+lwnotice("lwgeom_size_point: has bbox (%d)", result);
+#endif
+       }
+
+       if ( lwgeom_hasSRID(type))
+       {
+#ifdef DEBUG
+lwnotice("lwgeom_size_point: has srid (%d)", result);
+#endif
+               loc +=4; // type + SRID
+               result +=4;
+       }
+
+       result += lwgeom_ndims(type)*sizeof(double);
+
+       return result;
+}
+
+
+
index 6630ac5c8d9b2ff53cac37f5bfebdfa4caacaeff..917f4f9632fe018b9b259cb6f8935dce2e06d16c 100644 (file)
@@ -245,7 +245,7 @@ lwpoly_findbbox(LWPOLY *poly)
 }
 
 //find length of this serialized polygon
-uint32
+size_t
 lwgeom_size_poly(const char *serialized_poly)
 {
        uint32 result = 1; // char type
@@ -298,8 +298,8 @@ lwgeom_size_poly(const char *serialized_poly)
        {
                //read in a single ring and make a PA
                npoints = get_uint32(loc);
-               loc +=4;
-               result +=4;
+               loc += 4;
+               result += 4;
 
                if (ndims == 3)
                {