//liblwgeom.h
-#define DEBUG 1
-#define DEBUG_CALLS 1
+//#define DEBUG 1
+//#define DEBUG_CALLS 1
typedef void* (*lwallocator)(size_t size);
* 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);
//--------------------------------------------------------
-//********************************************************************
-// 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.
// --> 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]);
return result;
}
-uint32
+size_t
lwgeom_size_subgeom(const char *serialized_form, int geom_number)
{
if (geom_number == -1)
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");
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);
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);
#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)",
//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)",
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);
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];
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);
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;
+}
+
+
+
}
//find length of this serialized polygon
-uint32
+size_t
lwgeom_size_poly(const char *serialized_poly)
{
uint32 result = 1; // char type
{
//read in a single ring and make a PA
npoints = get_uint32(loc);
- loc +=4;
- result +=4;
+ loc += 4;
+ result += 4;
if (ndims == 3)
{