From 956920e4bcee8e87abd0fe076dec4dbf09fd2071 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 5 Oct 2004 17:15:42 +0000 Subject: [PATCH] Bug fix in size computation. git-svn-id: http://svn.osgeo.org/postgis/trunk@930 b70326c6-7e19-0410-871a-916f4a2858ee --- lwgeom/liblwgeom.h | 14 +++--- lwgeom/lwgeom_api.c | 75 +-------------------------------- lwgeom/lwgeom_functions_basic.c | 8 ++-- lwgeom/lwline.c | 15 +++---- lwgeom/lwpoint.c | 44 +++++++++++++++++++ lwgeom/lwpoly.c | 6 +-- 6 files changed, 68 insertions(+), 94 deletions(-) diff --git a/lwgeom/liblwgeom.h b/lwgeom/liblwgeom.h index 58dd4af4e..959efd1d3 100644 --- a/lwgeom/liblwgeom.h +++ b/lwgeom/liblwgeom.h @@ -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); //-------------------------------------------------------- diff --git a/lwgeom/lwgeom_api.c b/lwgeom/lwgeom_api.c index 483f094af..bc729d16a 100644 --- a/lwgeom/lwgeom_api.c +++ b/lwgeom/lwgeom_api.c @@ -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) diff --git a/lwgeom/lwgeom_functions_basic.c b/lwgeom/lwgeom_functions_basic.c index a8514fd34..56ecbff01 100644 --- a/lwgeom/lwgeom_functions_basic.c +++ b/lwgeom/lwgeom_functions_basic.c @@ -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; jpoints->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); diff --git a/lwgeom/lwline.c b/lwgeom/lwline.c index 87a6a6a5e..29722aca0 100644 --- a/lwgeom/lwline.c +++ b/lwgeom/lwline.c @@ -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); diff --git a/lwgeom/lwpoint.c b/lwgeom/lwpoint.c index 6f701caa9..15e1f4f23 100644 --- a/lwgeom/lwpoint.c +++ b/lwgeom/lwpoint.c @@ -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; +} + + + diff --git a/lwgeom/lwpoly.c b/lwgeom/lwpoly.c index 6630ac5c8..917f4f963 100644 --- a/lwgeom/lwpoly.c +++ b/lwgeom/lwpoly.c @@ -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) { -- 2.49.0