The code reachable from overzooming a tile no longer calls exit(). It
reports errors by throwing tippecanoe_error, and owns its FILE * and
json_pull * handles through RAII wrappers so that nothing leaks when an
error unwinds the stack.
New files:
* errors.hpp/errors.cpp: the tippecanoe_error exception class, plus
throw_tippecanoe_error() and throw_perror() helpers.
* raii.hpp: unique_file and unique_json_pull, both std::unique_ptr
aliases, for FILE * and json_pull *.
exit() becomes throw in clip.cpp, mvt.cpp, mvt.hpp, read_json.cpp,
evaluator.cpp, text.cpp, geometry.cpp, attribute.cpp, and
write_json.hpp. Each tool's main() is now a try/catch around an
inner_main(), so the command-line tools exit with the status they
always did.
Along the way this fixes a z_stream leaked when compress() failed, an
exit() that could run from json_writer's destructor during unwinding,
and an exit() in mvt_value's hash function.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuCSVGssWNUCpVEE8Yp5HT
* Add an option to generate label points in place of polygons
* Change all these places where I said "extent" but really meant "area"
* Revert "Change all these places where I said "extent" but really meant "area""
This reverts commit 403828d2f7.
* Add --order-smallest-first and --order-largest-first options
* Use Turf's center-of-mass algorithm for polygon label points
* If the label point isn't within the polygon, find one that is
* Don't choose a label point that is too close to a border
* Try a little harder to find an optimal label point
* Checkerboard which tiles labels are generated in, to reduce adjacency
* Use a label point for the general representative point for polygons
(Skipping the iteration to find one that is as far as possible from
the borders)
This makes the labels look better in many cases (like France at z1)
but unfortunately ripples into changing the sequence of polygons in
many tests, so the diff is big.
* Revert "Use a label point for the general representative point for polygons"
This reverts commit 2261adf05e.
* Checkpoint work on spiral labels
* Clip label spirals to the feature bounds
* Fix label test
* Be careful not to place spiral labels too close to borders either
* For spiral anchors, only check tile scale, not feature size
* Update test
* Only try to find a central label point for the largest ring
* In tiny polygon dust, keep the attributes of the largest feature
* Stop adding features to a tile if it can't possibly work
* Add --integer and --fraction options to tippecanoe-decode
* Carry the strategies field from tileset metadata through tile-join
* Update changelog
* Assign different codes to different kinds of error exits