[postgis-devel] [postgis-tickets] r16409 - Format lwgeom_geos_clean.c before digging in
Mateusz Loskot
mateusz at loskot.net
Thu Feb 22 08:25:40 PST 2018
BTW, I'd recall similar issues here
https://github.com/postgis/postgis/pull/202/files/2bd0c00f398ba82fda64a5dc48e39d06fa667063#r165690882
ML
On 22 February 2018 at 17:18, Daniel Baston <dbaston at gmail.com> wrote:
> Why are you doing this? Was there a discussion to switch the code base to a
> new style?
>
> Dan
>
> On Thu, Feb 22, 2018 at 10:52 AM, Darafei <komzpa at gmail.com> wrote:
>>
>> Author: komzpa
>> Date: 2018-02-22 07:52:47 -0800 (Thu, 22 Feb 2018)
>> New Revision: 16409
>>
>> Modified:
>> trunk/liblwgeom/lwgeom_geos_clean.c
>> Log:
>> Format lwgeom_geos_clean.c before digging in
>>
>> References #2508
>>
>>
>> Modified: trunk/liblwgeom/lwgeom_geos_clean.c
>> ===================================================================
>> --- trunk/liblwgeom/lwgeom_geos_clean.c 2018-02-22 13:42:00 UTC (rev
>> 16408)
>> +++ trunk/liblwgeom/lwgeom_geos_clean.c 2018-02-22 15:52:47 UTC (rev
>> 16409)
>> @@ -22,7 +22,6 @@
>> *
>> **********************************************************************/
>>
>> -
>> #include "liblwgeom.h"
>> #include "lwgeom_geos.h"
>> #include "liblwgeom_internal.h"
>> @@ -36,7 +35,6 @@
>> /* #define PARANOIA_LEVEL 2 */
>> #undef LWGEOM_PROFILE_MAKEVALID
>>
>> -
>> /*
>> * Return Nth vertex in GEOSGeometry as a POINT.
>> * May return NULL if the geometry has NO vertexex.
>> @@ -53,7 +51,7 @@
>> int gn;
>> GEOSGeometry* ret;
>>
>> - switch ( GEOSGeomTypeId(g_in) )
>> + switch (GEOSGeomTypeId(g_in))
>> {
>> case GEOS_MULTIPOINT:
>> case GEOS_MULTILINESTRING:
>> @@ -60,11 +58,11 @@
>> case GEOS_MULTIPOLYGON:
>> case GEOS_GEOMETRYCOLLECTION:
>> {
>> - for (gn=0; gn<GEOSGetNumGeometries(g_in); ++gn)
>> + for (gn = 0; gn < GEOSGetNumGeometries(g_in); ++gn)
>> {
>> const GEOSGeometry* g = GEOSGetGeometryN(g_in,
>> gn);
>> - ret = LWGEOM_GEOS_getPointN(g,n);
>> - if ( ret ) return ret;
>> + ret = LWGEOM_GEOS_getPointN(g, n);
>> + if (ret) return ret;
>> }
>> break;
>> }
>> @@ -72,12 +70,12 @@
>> case GEOS_POLYGON:
>> {
>> ret = LWGEOM_GEOS_getPointN(GEOSGetExteriorRing(g_in), n);
>> - if ( ret ) return ret;
>> - for (gn=0; gn<GEOSGetNumInteriorRings(g_in); ++gn)
>> + if (ret) return ret;
>> + for (gn = 0; gn < GEOSGetNumInteriorRings(g_in); ++gn)
>> {
>> const GEOSGeometry* g = GEOSGetInteriorRingN(g_in,
>> gn);
>> ret = LWGEOM_GEOS_getPointN(g, n);
>> - if ( ret ) return ret;
>> + if (ret) return ret;
>> }
>> break;
>> }
>> @@ -86,37 +84,34 @@
>> case GEOS_LINESTRING:
>> case GEOS_LINEARRING:
>> break;
>> -
>> }
>>
>> seq_in = GEOSGeom_getCoordSeq(g_in);
>> - if ( ! seq_in ) return NULL;
>> - if ( ! GEOSCoordSeq_getSize(seq_in, &sz) ) return NULL;
>> - if ( ! sz ) return NULL;
>> + if (!seq_in) return NULL;
>> + if (!GEOSCoordSeq_getSize(seq_in, &sz)) return NULL;
>> + if (!sz) return NULL;
>>
>> - if ( ! GEOSCoordSeq_getDimensions(seq_in, &dims) ) return NULL;
>> + if (!GEOSCoordSeq_getDimensions(seq_in, &dims)) return NULL;
>>
>> seq_out = GEOSCoordSeq_create(1, dims);
>> - if ( ! seq_out ) return NULL;
>> + if (!seq_out) return NULL;
>>
>> - if ( ! GEOSCoordSeq_getX(seq_in, n, &val) ) return NULL;
>> - if ( ! GEOSCoordSeq_setX(seq_out, n, val) ) return NULL;
>> - if ( ! GEOSCoordSeq_getY(seq_in, n, &val) ) return NULL;
>> - if ( ! GEOSCoordSeq_setY(seq_out, n, val) ) return NULL;
>> - if ( dims > 2 )
>> + if (!GEOSCoordSeq_getX(seq_in, n, &val)) return NULL;
>> + if (!GEOSCoordSeq_setX(seq_out, n, val)) return NULL;
>> + if (!GEOSCoordSeq_getY(seq_in, n, &val)) return NULL;
>> + if (!GEOSCoordSeq_setY(seq_out, n, val)) return NULL;
>> + if (dims > 2)
>> {
>> - if ( ! GEOSCoordSeq_getZ(seq_in, n, &val) ) return NULL;
>> - if ( ! GEOSCoordSeq_setZ(seq_out, n, val) ) return NULL;
>> + if (!GEOSCoordSeq_getZ(seq_in, n, &val)) return NULL;
>> + if (!GEOSCoordSeq_setZ(seq_out, n, val)) return NULL;
>> }
>>
>> return GEOSGeom_createPoint(seq_out);
>> }
>>
>> -
>> -
>> -LWGEOM * lwcollection_make_geos_friendly(LWCOLLECTION *g);
>> -LWGEOM * lwline_make_geos_friendly(LWLINE *line);
>> -LWGEOM * lwpoly_make_geos_friendly(LWPOLY *poly);
>> +LWGEOM* lwcollection_make_geos_friendly(LWCOLLECTION* g);
>> +LWGEOM* lwline_make_geos_friendly(LWLINE* line);
>> +LWGEOM* lwpoly_make_geos_friendly(LWPOLY* poly);
>> POINTARRAY* ring_make_geos_friendly(POINTARRAY* ring);
>>
>> /*
>> @@ -125,8 +120,8 @@
>> * May return the input untouched (if already valid).
>> * May return geometries of lower dimension (on collapses)
>> */
>> -static LWGEOM *
>> -lwgeom_make_geos_friendly(LWGEOM *geom)
>> +static LWGEOM*
>> +lwgeom_make_geos_friendly(LWGEOM* geom)
>> {
>> LWDEBUGF(2, "lwgeom_make_geos_friendly enter (type %d)",
>> geom->type);
>> switch (geom->type)
>> @@ -139,18 +134,18 @@
>>
>> case LINETYPE:
>> /* lines need at least 2 points */
>> - return lwline_make_geos_friendly((LWLINE *)geom);
>> + return lwline_make_geos_friendly((LWLINE*)geom);
>> break;
>>
>> case POLYGONTYPE:
>> /* polygons need all rings closed and with npoints > 3 */
>> - return lwpoly_make_geos_friendly((LWPOLY *)geom);
>> + return lwpoly_make_geos_friendly((LWPOLY*)geom);
>> break;
>>
>> case MULTILINETYPE:
>> case MULTIPOLYGONTYPE:
>> case COLLECTIONTYPE:
>> - return lwcollection_make_geos_friendly((LWCOLLECTION
>> *)geom);
>> + return
>> lwcollection_make_geos_friendly((LWCOLLECTION*)geom);
>> break;
>>
>> case CIRCSTRINGTYPE:
>> @@ -159,7 +154,9 @@
>> case MULTISURFACETYPE:
>> case MULTICURVETYPE:
>> default:
>> - lwerror("lwgeom_make_geos_friendly: unsupported input
>> geometry type: %s (%d)", lwtype_name(geom->type), geom->type);
>> + lwerror("lwgeom_make_geos_friendly: unsupported input
>> geometry type: %s (%d)",
>> + lwtype_name(geom->type),
>> + geom->type);
>> break;
>> }
>> return 0;
>> @@ -178,13 +175,10 @@
>> POINTARRAY* newring;
>>
>> /* close the ring if not already closed (2d only) */
>> - if ( ! ptarray_is_closed_2d(ring) )
>> + if (!ptarray_is_closed_2d(ring))
>> {
>> /* close it up */
>> - newring = ptarray_addPoint(ring,
>> - getPoint_internal(ring, 0),
>> - FLAGS_NDIMS(ring->flags),
>> - ring->npoints);
>> + newring = ptarray_addPoint(ring, getPoint_internal(ring,
>> 0), FLAGS_NDIMS(ring->flags), ring->npoints);
>> ring = newring;
>> }
>> return ring;
>> @@ -199,26 +193,19 @@
>>
>> /* close the ring if not already closed (2d only) */
>> closedring = ptarray_close2d(ring);
>> - if (closedring != ring )
>> - {
>> - ring = closedring;
>> - }
>> + if (closedring != ring) ring = closedring;
>>
>> /* return 0 for collapsed ring (after closeup) */
>>
>> - while ( ring->npoints < 4 )
>> + while (ring->npoints < 4)
>> {
>> - POINTARRAY *oring = ring;
>> + POINTARRAY* oring = ring;
>> LWDEBUGF(4, "ring has %d points, adding another",
>> ring->npoints);
>> /* let's add another... */
>> - ring = ptarray_addPoint(ring,
>> - getPoint_internal(ring, 0),
>> - FLAGS_NDIMS(ring->flags),
>> - ring->npoints);
>> - if ( oring != ring_in ) ptarray_free(oring);
>> + ring = ptarray_addPoint(ring, getPoint_internal(ring, 0),
>> FLAGS_NDIMS(ring->flags), ring->npoints);
>> + if (oring != ring_in) ptarray_free(oring);
>> }
>>
>> -
>> return ring;
>> }
>>
>> @@ -225,36 +212,35 @@
>> /* Make sure all rings are closed and have > 3 points.
>> * May return the input untouched.
>> */
>> -LWGEOM *
>> -lwpoly_make_geos_friendly(LWPOLY *poly)
>> +LWGEOM*
>> +lwpoly_make_geos_friendly(LWPOLY* poly)
>> {
>> LWGEOM* ret;
>> - POINTARRAY **new_rings;
>> + POINTARRAY** new_rings;
>> uint32_t i;
>>
>> /* If the polygon has no rings there's nothing to do */
>> - if ( ! poly->nrings ) return (LWGEOM*)poly;
>> + if (!poly->nrings) return (LWGEOM*)poly;
>>
>> /* Allocate enough pointers for all rings */
>> - new_rings = lwalloc(sizeof(POINTARRAY*)*poly->nrings);
>> + new_rings = lwalloc(sizeof(POINTARRAY*) * poly->nrings);
>>
>> /* All rings must be closed and have > 3 points */
>> - for (i=0; i<poly->nrings; i++)
>> + for (i = 0; i < poly->nrings; i++)
>> {
>> POINTARRAY* ring_in = poly->rings[i];
>> POINTARRAY* ring_out = ring_make_geos_friendly(ring_in);
>>
>> - if ( ring_in != ring_out )
>> + if (ring_in != ring_out)
>> {
>> - LWDEBUGF(3, "lwpoly_make_geos_friendly: ring %d
>> cleaned, now has %d points", i, ring_out->npoints);
>> + LWDEBUGF(
>> + 3, "lwpoly_make_geos_friendly: ring %d
>> cleaned, now has %d points", i, ring_out->npoints);
>> ptarray_free(ring_in);
>> }
>> else
>> - {
>> LWDEBUGF(3, "lwpoly_make_geos_friendly: ring %d
>> untouched", i);
>> - }
>>
>> - assert ( ring_out );
>> + assert(ring_out);
>> new_rings[i] = ring_out;
>> }
>>
>> @@ -266,10 +252,10 @@
>> }
>>
>> /* Need NO or >1 points. Duplicate first if only one. */
>> -LWGEOM *
>> -lwline_make_geos_friendly(LWLINE *line)
>> +LWGEOM*
>> +lwline_make_geos_friendly(LWLINE* line)
>> {
>> - LWGEOM *ret;
>> + LWGEOM* ret;
>>
>> if (line->points->npoints == 1) /* 0 is fine, 2 is fine */
>> {
>> @@ -276,9 +262,9 @@
>> #if 1
>> /* Duplicate point */
>> line->points = ptarray_addPoint(line->points,
>> -
>> getPoint_internal(line->points, 0),
>> -
>> FLAGS_NDIMS(line->points->flags),
>> - line->points->npoints);
>> +
>> getPoint_internal(line->points, 0),
>> +
>> FLAGS_NDIMS(line->points->flags),
>> + line->points->npoints);
>> ret = (LWGEOM*)line;
>> #else
>> /* Turn into a point */
>> @@ -293,38 +279,36 @@
>> }
>> }
>>
>> -LWGEOM *
>> -lwcollection_make_geos_friendly(LWCOLLECTION *g)
>> +LWGEOM*
>> +lwcollection_make_geos_friendly(LWCOLLECTION* g)
>> {
>> - LWGEOM **new_geoms;
>> - uint32_t i, new_ngeoms=0;
>> - LWCOLLECTION *ret;
>> + LWGEOM** new_geoms;
>> + uint32_t i, new_ngeoms = 0;
>> + LWCOLLECTION* ret;
>>
>> /* enough space for all components */
>> - new_geoms = lwalloc(sizeof(LWGEOM *)*g->ngeoms);
>> + new_geoms = lwalloc(sizeof(LWGEOM*) * g->ngeoms);
>>
>> ret = lwalloc(sizeof(LWCOLLECTION));
>> memcpy(ret, g, sizeof(LWCOLLECTION));
>> - ret->maxgeoms = g->ngeoms;
>> + ret->maxgeoms = g->ngeoms;
>>
>> - for (i=0; i<g->ngeoms; i++)
>> + for (i = 0; i < g->ngeoms; i++)
>> {
>> LWGEOM* newg = lwgeom_make_geos_friendly(g->geoms[i]);
>> - if ( newg ) new_geoms[new_ngeoms++] = newg;
>> + if (newg) new_geoms[new_ngeoms++] = newg;
>> }
>>
>> ret->bbox = NULL; /* recompute later... */
>>
>> ret->ngeoms = new_ngeoms;
>> - if ( new_ngeoms )
>> - {
>> + if (new_ngeoms)
>> ret->geoms = new_geoms;
>> - }
>> else
>> {
>> free(new_geoms);
>> ret->geoms = NULL;
>> - ret->maxgeoms = 0;
>> + ret->maxgeoms = 0;
>> }
>>
>> return (LWGEOM*)ret;
>> @@ -347,14 +331,12 @@
>> */
>>
>> point = LWGEOM_GEOS_getPointN(lines, 0);
>> - if ( ! point ) return NULL;
>> + if (!point) return NULL;
>>
>> - LWDEBUGF(3,
>> - "Boundary point: %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(point, 0)));
>> + LWDEBUGF(3, "Boundary point: %s",
>> lwgeom_to_ewkt(GEOS2LWGEOM(point, 0)));
>>
>> noded = GEOSUnion(lines, point);
>> - if ( NULL == noded )
>> + if (NULL == noded)
>> {
>> GEOSGeom_destroy(point);
>> return NULL;
>> @@ -363,9 +345,9 @@
>> GEOSGeom_destroy(point);
>>
>> LWDEBUGF(3,
>> - "LWGEOM_GEOS_nodeLines: in[%s] out[%s]",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(lines, 0)),
>> - lwgeom_to_ewkt(GEOS2LWGEOM(noded, 0)));
>> + "LWGEOM_GEOS_nodeLines: in[%s] out[%s]",
>> + lwgeom_to_ewkt(GEOS2LWGEOM(lines, 0)),
>> + lwgeom_to_ewkt(GEOS2LWGEOM(noded, 0)));
>>
>> return noded;
>> }
>> @@ -381,31 +363,24 @@
>> GEOSGeom gout;
>> GEOSGeom geos_bound;
>> GEOSGeom geos_cut_edges, geos_area, collapse_points;
>> - GEOSGeometry *vgeoms[3]; /* One for area, one for cut-edges */
>> - unsigned int nvgeoms=0;
>> + GEOSGeometry* vgeoms[3]; /* One for area, one for cut-edges */
>> + unsigned int nvgeoms = 0;
>>
>> - assert (GEOSGeomTypeId(gin) == GEOS_POLYGON ||
>> - GEOSGeomTypeId(gin) == GEOS_MULTIPOLYGON);
>> + assert(GEOSGeomTypeId(gin) == GEOS_POLYGON || GEOSGeomTypeId(gin)
>> == GEOS_MULTIPOLYGON);
>>
>> geos_bound = GEOSBoundary(gin);
>> - if ( NULL == geos_bound )
>> - {
>> - return NULL;
>> - }
>> + if (NULL == geos_bound) return NULL;
>>
>> - LWDEBUGF(3,
>> - "Boundaries: %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(geos_bound, 0)));
>> + LWDEBUGF(3, "Boundaries: %s",
>> lwgeom_to_ewkt(GEOS2LWGEOM(geos_bound, 0)));
>>
>> /* Use noded boundaries as initial "cut" edges */
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: noding lines");
>> + lwnotice("ST_MakeValid: noding lines");
>> #endif
>>
>> -
>> geos_cut_edges = LWGEOM_GEOS_nodeLines(geos_bound);
>> - if ( NULL == geos_cut_edges )
>> + if (NULL == geos_cut_edges)
>> {
>> GEOSGeom_destroy(geos_bound);
>> lwnotice("LWGEOM_GEOS_nodeLines(): %s",
>> lwgeom_geos_errmsg);
>> @@ -419,46 +394,40 @@
>> GEOSGeometry* po;
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: extracting unique points from bounds");
>> + lwnotice("ST_MakeValid: extracting unique points from
>> bounds");
>> #endif
>>
>> pi = GEOSGeom_extractUniquePoints(geos_bound);
>> - if ( NULL == pi )
>> + if (NULL == pi)
>> {
>> GEOSGeom_destroy(geos_bound);
>> - lwnotice("GEOSGeom_extractUniquePoints(): %s",
>> - lwgeom_geos_errmsg);
>> + lwnotice("GEOSGeom_extractUniquePoints(): %s",
>> lwgeom_geos_errmsg);
>> return NULL;
>> }
>>
>> - LWDEBUGF(3,
>> - "Boundaries input points %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(pi, 0)));
>> + LWDEBUGF(3, "Boundaries input points %s",
>> lwgeom_to_ewkt(GEOS2LWGEOM(pi, 0)));
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: extracting unique points from cut_edges");
>> + lwnotice("ST_MakeValid: extracting unique points from
>> cut_edges");
>> #endif
>>
>> po = GEOSGeom_extractUniquePoints(geos_cut_edges);
>> - if ( NULL == po )
>> + if (NULL == po)
>> {
>> GEOSGeom_destroy(geos_bound);
>> GEOSGeom_destroy(pi);
>> - lwnotice("GEOSGeom_extractUniquePoints(): %s",
>> - lwgeom_geos_errmsg);
>> + lwnotice("GEOSGeom_extractUniquePoints(): %s",
>> lwgeom_geos_errmsg);
>> return NULL;
>> }
>>
>> - LWDEBUGF(3,
>> - "Boundaries output points %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(po, 0)));
>> + LWDEBUGF(3, "Boundaries output points %s",
>> lwgeom_to_ewkt(GEOS2LWGEOM(po, 0)));
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: find collapse points");
>> + lwnotice("ST_MakeValid: find collapse points");
>> #endif
>>
>> collapse_points = GEOSDifference(pi, po);
>> - if ( NULL == collapse_points )
>> + if (NULL == collapse_points)
>> {
>> GEOSGeom_destroy(geos_bound);
>> GEOSGeom_destroy(pi);
>> @@ -467,12 +436,10 @@
>> return NULL;
>> }
>>
>> - LWDEBUGF(3,
>> - "Collapse points: %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(collapse_points,
>> 0)));
>> + LWDEBUGF(3, "Collapse points: %s",
>> lwgeom_to_ewkt(GEOS2LWGEOM(collapse_points, 0)));
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: cleanup(1)");
>> + lwnotice("ST_MakeValid: cleanup(1)");
>> #endif
>>
>> GEOSGeom_destroy(pi);
>> @@ -480,13 +447,11 @@
>> }
>> GEOSGeom_destroy(geos_bound);
>>
>> - LWDEBUGF(3,
>> - "Noded Boundaries: %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(geos_cut_edges, 0)));
>> + LWDEBUGF(3, "Noded Boundaries: %s",
>> lwgeom_to_ewkt(GEOS2LWGEOM(geos_cut_edges, 0)));
>>
>> /* And use an empty geometry as initial "area" */
>> geos_area = GEOSGeom_createEmptyPolygon();
>> - if ( ! geos_area )
>> + if (!geos_area)
>> {
>> lwnotice("GEOSGeom_createEmptyPolygon(): %s",
>> lwgeom_geos_errmsg);
>> GEOSGeom_destroy(geos_cut_edges);
>> @@ -501,13 +466,13 @@
>> */
>> while (GEOSGetNumGeometries(geos_cut_edges))
>> {
>> - GEOSGeometry* new_area=0;
>> - GEOSGeometry* new_area_bound=0;
>> - GEOSGeometry* symdif=0;
>> - GEOSGeometry* new_cut_edges=0;
>> + GEOSGeometry* new_area = 0;
>> + GEOSGeometry* new_area_bound = 0;
>> + GEOSGeometry* symdif = 0;
>> + GEOSGeometry* new_cut_edges = 0;
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: building area from %d edges",
>> GEOSGetNumGeometries(geos_cut_edges));
>> + lwnotice("ST_MakeValid: building area from %d edges",
>> GEOSGetNumGeometries(geos_cut_edges));
>> #endif
>>
>> /*
>> @@ -515,16 +480,15 @@
>> */
>>
>> new_area = LWGEOM_GEOS_buildArea(geos_cut_edges);
>> - if ( ! new_area ) /* must be an exception */
>> + if (!new_area) /* must be an exception */
>> {
>> GEOSGeom_destroy(geos_cut_edges);
>> GEOSGeom_destroy(geos_area);
>> - lwnotice("LWGEOM_GEOS_buildArea() threw an error:
>> %s",
>> - lwgeom_geos_errmsg);
>> + lwnotice("LWGEOM_GEOS_buildArea() threw an error:
>> %s", lwgeom_geos_errmsg);
>> return NULL;
>> }
>>
>> - if ( GEOSisEmpty(new_area) )
>> + if (GEOSisEmpty(new_area))
>> {
>> /* no more rings can be build with thes edges */
>> GEOSGeom_destroy(new_area);
>> @@ -536,7 +500,8 @@
>> */
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: ring built with %d cut edges, saving
>> boundaries", GEOSGetNumGeometries(geos_cut_edges));
>> + lwnotice("ST_MakeValid: ring built with %d cut edges,
>> saving boundaries",
>> + GEOSGetNumGeometries(geos_cut_edges));
>> #endif
>>
>> /*
>> @@ -544,13 +509,13 @@
>> * further cut edges later)
>> */
>> new_area_bound = GEOSBoundary(new_area);
>> - if ( ! new_area_bound )
>> + if (!new_area_bound)
>> {
>> /* We did check for empty area already so
>> * this must be some other error */
>> lwnotice("GEOSBoundary('%s') threw an error: %s",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(new_area, 0)),
>> - lwgeom_geos_errmsg);
>> + lwgeom_to_ewkt(GEOS2LWGEOM(new_area, 0)),
>> + lwgeom_geos_errmsg);
>> GEOSGeom_destroy(new_area);
>> GEOSGeom_destroy(geos_area);
>> return NULL;
>> @@ -557,7 +522,7 @@
>> }
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: running SymDifference with new area");
>> + lwnotice("ST_MakeValid: running SymDifference with new
>> area");
>> #endif
>>
>> /*
>> @@ -564,14 +529,13 @@
>> * Now symdif new and old area
>> */
>> symdif = GEOSSymDifference(geos_area, new_area);
>> - if ( ! symdif ) /* must be an exception */
>> + if (!symdif) /* must be an exception */
>> {
>> GEOSGeom_destroy(geos_cut_edges);
>> GEOSGeom_destroy(new_area);
>> GEOSGeom_destroy(new_area_bound);
>> GEOSGeom_destroy(geos_area);
>> - lwnotice("GEOSSymDifference() threw an error: %s",
>> - lwgeom_geos_errmsg);
>> + lwnotice("GEOSSymDifference() threw an error: %s",
>> lwgeom_geos_errmsg);
>> return NULL;
>> }
>>
>> @@ -592,19 +556,18 @@
>> */
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: computing new cut_edges (GEOSDifference)");
>> + lwnotice("ST_MakeValid: computing new cut_edges
>> (GEOSDifference)");
>> #endif
>>
>> new_cut_edges = GEOSDifference(geos_cut_edges,
>> new_area_bound);
>> GEOSGeom_destroy(new_area_bound);
>> - if ( ! new_cut_edges ) /* an exception ? */
>> + if (!new_cut_edges) /* an exception ? */
>> {
>> /* cleanup and throw */
>> GEOSGeom_destroy(geos_cut_edges);
>> GEOSGeom_destroy(geos_area);
>> /* TODO: Shouldn't this be an lwerror ? */
>> - lwnotice("GEOSDifference() threw an error: %s",
>> - lwgeom_geos_errmsg);
>> + lwnotice("GEOSDifference() threw an error: %s",
>> lwgeom_geos_errmsg);
>> return NULL;
>> }
>> GEOSGeom_destroy(geos_cut_edges);
>> @@ -612,37 +575,25 @@
>> }
>>
>> #ifdef LWGEOM_PROFILE_MAKEVALID
>> - lwnotice("ST_MakeValid: final checks");
>> + lwnotice("ST_MakeValid: final checks");
>> #endif
>>
>> - if ( ! GEOSisEmpty(geos_area) )
>> - {
>> + if (!GEOSisEmpty(geos_area))
>> vgeoms[nvgeoms++] = geos_area;
>> - }
>> else
>> - {
>> GEOSGeom_destroy(geos_area);
>> - }
>>
>> - if ( ! GEOSisEmpty(geos_cut_edges) )
>> - {
>> + if (!GEOSisEmpty(geos_cut_edges))
>> vgeoms[nvgeoms++] = geos_cut_edges;
>> - }
>> else
>> - {
>> GEOSGeom_destroy(geos_cut_edges);
>> - }
>>
>> - if ( ! GEOSisEmpty(collapse_points) )
>> - {
>> + if (!GEOSisEmpty(collapse_points))
>> vgeoms[nvgeoms++] = collapse_points;
>> - }
>> else
>> - {
>> GEOSGeom_destroy(collapse_points);
>> - }
>>
>> - if ( 1 == nvgeoms )
>> + if (1 == nvgeoms)
>> {
>> /* Return cut edges */
>> gout = vgeoms[0];
>> @@ -651,12 +602,11 @@
>> {
>> /* Collect areas and lines (if any line) */
>> gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION,
>> vgeoms, nvgeoms);
>> - if ( ! gout ) /* an exception again */
>> + if (!gout) /* an exception again */
>> {
>> /* cleanup and throw */
>> /* TODO: Shouldn't this be an lwerror ? */
>> - lwnotice("GEOSGeom_createCollection() threw an
>> error: %s",
>> - lwgeom_geos_errmsg);
>> + lwnotice("GEOSGeom_createCollection() threw an
>> error: %s", lwgeom_geos_errmsg);
>> /* TODO: cleanup! */
>> return NULL;
>> }
>> @@ -663,7 +613,6 @@
>> }
>>
>> return gout;
>> -
>> }
>>
>> static GEOSGeometry*
>> @@ -679,44 +628,40 @@
>> {
>> GEOSGeometry** lines;
>> GEOSGeometry** points;
>> - GEOSGeometry* mline_out=0;
>> - GEOSGeometry* mpoint_out=0;
>> - GEOSGeometry* gout=0;
>> - uint32_t nlines=0, nlines_alloc;
>> - uint32_t npoints=0;
>> - uint32_t ngeoms=0, nsubgeoms;
>> + GEOSGeometry* mline_out = 0;
>> + GEOSGeometry* mpoint_out = 0;
>> + GEOSGeometry* gout = 0;
>> + uint32_t nlines = 0, nlines_alloc;
>> + uint32_t npoints = 0;
>> + uint32_t ngeoms = 0, nsubgeoms;
>> uint32_t i, j;
>>
>> ngeoms = GEOSGetNumGeometries(gin);
>>
>> nlines_alloc = ngeoms;
>> - lines = lwalloc(sizeof(GEOSGeometry*)*nlines_alloc);
>> - points = lwalloc(sizeof(GEOSGeometry*)*ngeoms);
>> + lines = lwalloc(sizeof(GEOSGeometry*) * nlines_alloc);
>> + points = lwalloc(sizeof(GEOSGeometry*) * ngeoms);
>>
>> - for (i=0; i<ngeoms; ++i)
>> + for (i = 0; i < ngeoms; ++i)
>> {
>> const GEOSGeometry* g = GEOSGetGeometryN(gin, i);
>> GEOSGeometry* vg;
>> vg = LWGEOM_GEOS_makeValidLine(g);
>> - if ( GEOSisEmpty(vg) )
>> + if (GEOSisEmpty(vg))
>> {
>> /* we don't care about this one */
>> GEOSGeom_destroy(vg);
>> }
>> - if ( GEOSGeomTypeId(vg) == GEOS_POINT )
>> - {
>> + if (GEOSGeomTypeId(vg) == GEOS_POINT)
>> points[npoints++] = vg;
>> - }
>> - else if ( GEOSGeomTypeId(vg) == GEOS_LINESTRING )
>> - {
>> + else if (GEOSGeomTypeId(vg) == GEOS_LINESTRING)
>> lines[nlines++] = vg;
>> - }
>> - else if ( GEOSGeomTypeId(vg) == GEOS_MULTILINESTRING )
>> + else if (GEOSGeomTypeId(vg) == GEOS_MULTILINESTRING)
>> {
>> - nsubgeoms=GEOSGetNumGeometries(vg);
>> + nsubgeoms = GEOSGetNumGeometries(vg);
>> nlines_alloc += nsubgeoms;
>> - lines = lwrealloc(lines,
>> sizeof(GEOSGeometry*)*nlines_alloc);
>> - for (j=0; j<nsubgeoms; ++j)
>> + lines = lwrealloc(lines, sizeof(GEOSGeometry*) *
>> nlines_alloc);
>> + for (j = 0; j < nsubgeoms; ++j)
>> {
>> const GEOSGeometry* gc =
>> GEOSGetGeometryN(vg, j);
>> /* NOTE: ownership of the cloned geoms
>> will be
>> @@ -728,55 +673,39 @@
>> {
>> /* NOTE: return from GEOSGeomType will leak
>> * but we really don't expect this to happen */
>> - lwerror("unexpected geom type returned "
>> - "by LWGEOM_GEOS_makeValid: %s",
>> - GEOSGeomType(vg));
>> + lwerror("unexpected geom type returned by
>> LWGEOM_GEOS_makeValid: %s", GEOSGeomType(vg));
>> }
>> }
>>
>> - if ( npoints )
>> + if (npoints)
>> {
>> - if ( npoints > 1 )
>> - {
>> - mpoint_out =
>> GEOSGeom_createCollection(GEOS_MULTIPOINT,
>> - points,
>> npoints);
>> - }
>> + if (npoints > 1)
>> + mpoint_out =
>> GEOSGeom_createCollection(GEOS_MULTIPOINT, points, npoints);
>> else
>> - {
>> mpoint_out = points[0];
>> - }
>> }
>>
>> - if ( nlines )
>> + if (nlines)
>> {
>> - if ( nlines > 1 )
>> - {
>> - mline_out = GEOSGeom_createCollection(
>> - GEOS_MULTILINESTRING, lines,
>> nlines);
>> - }
>> + if (nlines > 1)
>> + mline_out =
>> GEOSGeom_createCollection(GEOS_MULTILINESTRING, lines, nlines);
>> else
>> - {
>> mline_out = lines[0];
>> - }
>> }
>>
>> lwfree(lines);
>>
>> - if ( mline_out && mpoint_out )
>> + if (mline_out && mpoint_out)
>> {
>> points[0] = mline_out;
>> points[1] = mpoint_out;
>> - gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION,
>> - points, 2);
>> + gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION,
>> points, 2);
>> }
>> - else if ( mline_out )
>> - {
>> + else if (mline_out)
>> gout = mline_out;
>> - }
>> - else if ( mpoint_out )
>> - {
>> +
>> + else if (mpoint_out)
>> gout = mpoint_out;
>> - }
>>
>> lwfree(points);
>>
>> @@ -793,27 +722,31 @@
>> LWGEOM_GEOS_makeValidCollection(const GEOSGeometry* gin)
>> {
>> int nvgeoms;
>> - GEOSGeometry **vgeoms;
>> + GEOSGeometry** vgeoms;
>> GEOSGeom gout;
>> int i;
>>
>> nvgeoms = GEOSGetNumGeometries(gin);
>> - if ( nvgeoms == -1 ) {
>> + if (nvgeoms == -1)
>> + {
>> lwerror("GEOSGetNumGeometries: %s", lwgeom_geos_errmsg);
>> return 0;
>> }
>>
>> - vgeoms = lwalloc( sizeof(GEOSGeometry*) * nvgeoms );
>> - if ( ! vgeoms ) {
>> + vgeoms = lwalloc(sizeof(GEOSGeometry*) * nvgeoms);
>> + if (!vgeoms)
>> + {
>> lwerror("LWGEOM_GEOS_makeValidCollection: out of memory");
>> return 0;
>> }
>>
>> - for ( i=0; i<nvgeoms; ++i ) {
>> - vgeoms[i] = LWGEOM_GEOS_makeValid( GEOSGetGeometryN(gin,
>> i) );
>> - if ( ! vgeoms[i] ) {
>> + for (i = 0; i < nvgeoms; ++i)
>> + {
>> + vgeoms[i] = LWGEOM_GEOS_makeValid(GEOSGetGeometryN(gin,
>> i));
>> + if (!vgeoms[i])
>> + {
>> int j;
>> - for (j = 0; j<i-1; j++)
>> + for (j = 0; j < i - 1; j++)
>> GEOSGeom_destroy(vgeoms[j]);
>> lwfree(vgeoms);
>> /* we expect lwerror being called already by
>> makeValid */
>> @@ -823,22 +756,20 @@
>>
>> /* Collect areas and lines (if any line) */
>> gout = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, vgeoms,
>> nvgeoms);
>> - if ( ! gout ) /* an exception again */
>> + if (!gout) /* an exception again */
>> {
>> /* cleanup and throw */
>> - for ( i=0; i<nvgeoms; ++i ) GEOSGeom_destroy(vgeoms[i]);
>> + for (i = 0; i < nvgeoms; ++i)
>> + GEOSGeom_destroy(vgeoms[i]);
>> lwfree(vgeoms);
>> - lwerror("GEOSGeom_createCollection() threw an error: %s",
>> - lwgeom_geos_errmsg);
>> + lwerror("GEOSGeom_createCollection() threw an error: %s",
>> lwgeom_geos_errmsg);
>> return NULL;
>> }
>> lwfree(vgeoms);
>>
>> return gout;
>> -
>> }
>>
>> -
>> static GEOSGeometry*
>> LWGEOM_GEOS_makeValid(const GEOSGeometry* gin)
>> {
>> @@ -850,17 +781,15 @@
>> */
>>
>> ret_char = GEOSisValid(gin);
>> - if ( ret_char == 2 )
>> + if (ret_char == 2)
>> {
>> /* I don't think should ever happen */
>> lwerror("GEOSisValid(): %s", lwgeom_geos_errmsg);
>> return NULL;
>> }
>> - else if ( ret_char )
>> + else if (ret_char)
>> {
>> - LWDEBUGF(3,
>> - "Geometry [%s] is valid. ",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)));
>> + LWDEBUGF(3, "Geometry [%s] is valid. ",
>> lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)));
>>
>> /* It's valid at this step, return what we have */
>> return GEOSGeom_clone(gin);
>> @@ -867,12 +796,10 @@
>> }
>>
>> LWDEBUGF(3,
>> - "Geometry [%s] is still not valid: %s. "
>> - "Will try to clean up further.",
>> - lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)),
>> lwgeom_geos_errmsg);
>> + "Geometry [%s] is still not valid: %s. Will try to clean
>> up further.",
>> + lwgeom_to_ewkt(GEOS2LWGEOM(gin, 0)),
>> + lwgeom_geos_errmsg);
>>
>> -
>> -
>> /*
>> * Step 3 : make what we got valid
>> */
>> @@ -888,7 +815,7 @@
>>
>> case GEOS_LINESTRING:
>> gout = LWGEOM_GEOS_makeValidLine(gin);
>> - if ( ! gout ) /* an exception or something */
>> + if (!gout) /* an exception or something */
>> {
>> /* cleanup and throw */
>> lwerror("%s", lwgeom_geos_errmsg);
>> @@ -898,7 +825,7 @@
>>
>> case GEOS_MULTILINESTRING:
>> gout = LWGEOM_GEOS_makeValidMultiLine(gin);
>> - if ( ! gout ) /* an exception or something */
>> + if (!gout) /* an exception or something */
>> {
>> /* cleanup and throw */
>> lwerror("%s", lwgeom_geos_errmsg);
>> @@ -910,7 +837,7 @@
>> case GEOS_MULTIPOLYGON:
>> {
>> gout = LWGEOM_GEOS_makeValidPolygon(gin);
>> - if ( ! gout ) /* an exception or something */
>> + if (!gout) /* an exception or something */
>> {
>> /* cleanup and throw */
>> lwerror("%s", lwgeom_geos_errmsg);
>> @@ -922,7 +849,7 @@
>> case GEOS_GEOMETRYCOLLECTION:
>> {
>> gout = LWGEOM_GEOS_makeValidCollection(gin);
>> - if ( ! gout ) /* an exception or something */
>> + if (!gout) /* an exception or something */
>> {
>> /* cleanup and throw */
>> lwerror("%s", lwgeom_geos_errmsg);
>> @@ -934,8 +861,7 @@
>> default:
>> {
>> char* typname = GEOSGeomType(gin);
>> - lwnotice("ST_MakeValid: doesn't support geometry type:
>> %s",
>> - typname);
>> + lwnotice("ST_MakeValid: doesn't support geometry type:
>> %s", typname);
>> GEOSFree(typname);
>> return NULL;
>> break;
>> @@ -944,35 +870,33 @@
>>
>> #if PARANOIA_LEVEL > 1
>> /*
>> - * Now check if every point of input is also found
>> - * in output, or abort by returning NULL
>> + * Now check if every point of input is also found in output, or
>> abort by returning NULL
>> *
>> * Input geometry was lwgeom_in
>> */
>> {
>> - int loss;
>> - GEOSGeometry *pi, *po, *pd;
>> + int loss;
>> + GEOSGeometry *pi, *po, *pd;
>>
>> - /* TODO: handle some errors here...
>> - * Lack of exceptions is annoying indeed,
>> - * I'm getting old --strk;
>> - */
>> - pi = GEOSGeom_extractUniquePoints(gin);
>> - po = GEOSGeom_extractUniquePoints(gout);
>> - pd = GEOSDifference(pi, po); /* input points -
>> output points */
>> - GEOSGeom_destroy(pi);
>> - GEOSGeom_destroy(po);
>> - loss = !GEOSisEmpty(pd);
>> - GEOSGeom_destroy(pd);
>> - if ( loss )
>> - {
>> - lwnotice("%s [%d] Vertices lost in
>> LWGEOM_GEOS_makeValid", __FILE__, __LINE__);
>> - /* return NULL */
>> - }
>> + /* TODO: handle some errors here...
>> + * Lack of exceptions is annoying indeed,
>> + * I'm getting old --strk;
>> + */
>> + pi = GEOSGeom_extractUniquePoints(gin);
>> + po = GEOSGeom_extractUniquePoints(gout);
>> + pd = GEOSDifference(pi, po); /* input points - output
>> points */
>> + GEOSGeom_destroy(pi);
>> + GEOSGeom_destroy(po);
>> + loss = !GEOSisEmpty(pd);
>> + GEOSGeom_destroy(pd);
>> + if (loss)
>> + {
>> + lwnotice("%s [%d] Vertices lost in
>> LWGEOM_GEOS_makeValid", __FILE__, __LINE__);
>> + /* return NULL */
>> + }
>> }
>> #endif /* PARANOIA_LEVEL > 1 */
>>
>> -
>> return gout;
>> }
>>
>> @@ -983,7 +907,7 @@
>> int is3d;
>> GEOSGeom geosgeom;
>> GEOSGeometry* geosout;
>> - LWGEOM *lwgeom_out;
>> + LWGEOM* lwgeom_out;
>>
>> is3d = FLAGS_GET_Z(lwgeom_in->flags);
>>
>> @@ -996,30 +920,24 @@
>>
>> lwgeom_out = lwgeom_in;
>> geosgeom = LWGEOM2GEOS(lwgeom_out, 0);
>> - if ( ! geosgeom )
>> + if (!geosgeom)
>> {
>> LWDEBUGF(4,
>> - "Original geom can't be converted to GEOS
>> (%s)"
>> - " - will try cleaning that up first",
>> - lwgeom_geos_errmsg);
>> + "Original geom can't be converted to GEOS (%s)"
>> + " - will try cleaning that up first",
>> + lwgeom_geos_errmsg);
>>
>> -
>> lwgeom_out = lwgeom_make_geos_friendly(lwgeom_out);
>> - if ( ! lwgeom_out )
>> - {
>> - lwerror("Could not make a valid geometry out of
>> input");
>> - }
>> + if (!lwgeom_out) lwerror("Could not make a valid geometry
>> out of input");
>>
>> /* try again as we did cleanup now */
>> /* TODO: invoke LWGEOM2GEOS directly with autoclean ? */
>> geosgeom = LWGEOM2GEOS(lwgeom_out, 0);
>> - if ( ! geosgeom )
>> + if (!geosgeom)
>> {
>> - lwerror("Couldn't convert POSTGIS geom to GEOS:
>> %s",
>> - lwgeom_geos_errmsg);
>> + lwerror("Couldn't convert POSTGIS geom to GEOS:
>> %s", lwgeom_geos_errmsg);
>> return NULL;
>> }
>> -
>> }
>> else
>> {
>> @@ -1029,30 +947,26 @@
>>
>> geosout = LWGEOM_GEOS_makeValid(geosgeom);
>> GEOSGeom_destroy(geosgeom);
>> - if ( ! geosout )
>> - {
>> - return NULL;
>> - }
>> + if (!geosout) return NULL;
>>
>> lwgeom_out = GEOS2LWGEOM(geosout, is3d);
>> GEOSGeom_destroy(geosout);
>>
>> - if ( lwgeom_is_collection(lwgeom_in) && !
>> lwgeom_is_collection(lwgeom_out) )
>> - {{
>> - LWGEOM **ogeoms = lwalloc(sizeof(LWGEOM*));
>> - LWGEOM *ogeom;
>> + if (lwgeom_is_collection(lwgeom_in) &&
>> !lwgeom_is_collection(lwgeom_out))
>> + {
>> + LWGEOM** ogeoms = lwalloc(sizeof(LWGEOM*));
>> + LWGEOM* ogeom;
>> LWDEBUG(3, "lwgeom_make_valid: forcing multi");
>> /* NOTE: this is safe because lwgeom_out is surely not
>> lwgeom_in or
>> * otherwise we couldn't have a collection and a
>> non-collection */
>> assert(lwgeom_in != lwgeom_out);
>> ogeoms[0] = lwgeom_out;
>> - ogeom = (LWGEOM
>> *)lwcollection_construct(MULTITYPE[lwgeom_out->type],
>> - lwgeom_out->srid,
>> lwgeom_out->bbox, 1, ogeoms);
>> + ogeom = (LWGEOM*)lwcollection_construct(
>> + MULTITYPE[lwgeom_out->type], lwgeom_out->srid,
>> lwgeom_out->bbox, 1, ogeoms);
>> lwgeom_out->bbox = NULL;
>> lwgeom_out = ogeom;
>> - }}
>> + }
>>
>> lwgeom_out->srid = lwgeom_in->srid;
>> return lwgeom_out;
>> }
>> -
>>
>> _______________________________________________
>> postgis-tickets mailing list
>> postgis-tickets at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/postgis-tickets
>
>
>
> _______________________________________________
> postgis-devel mailing list
> postgis-devel at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/postgis-devel
--
Mateusz Loskot, http://mateusz.loskot.net
More information about the postgis-devel
mailing list