From 79fa26dcf4cccc16ab95f46ac3f7f6e87767680c Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Sun, 11 Mar 2018 22:28:47 +0100 Subject: Make sure that transient errors are returned correctly The prepare/finalize steps in pj_fwd*/pj_inv* now checks the error level of the PJ object before returning the coordinate. If an error is detected proj_coord_error() is returned. --- src/pj_fwd.c | 19 ++++++++++++++++++- src/pj_inv.c | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pj_fwd.c b/src/pj_fwd.c index b2e6afd5..af0aae20 100644 --- a/src/pj_fwd.c +++ b/src/pj_fwd.c @@ -200,6 +200,12 @@ XY pj_fwd(LP lp, PJ *P) { if (!P->skip_fwd_finalize) coo = fwd_finalize (P, coo); + + if (proj_errno(P)) { + proj_errno_reset(P); + return proj_coord_error().xy; + } + return coo.xy; } @@ -208,7 +214,6 @@ XY pj_fwd(LP lp, PJ *P) { XYZ pj_fwd3d(LPZ lpz, PJ *P) { PJ_COORD coo = {{0,0,0,0}}; coo.lpz = lpz; - if (!P->skip_fwd_prepare) coo = fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -230,6 +235,12 @@ XYZ pj_fwd3d(LPZ lpz, PJ *P) { if (!P->skip_fwd_finalize) coo = fwd_finalize (P, coo); + + if (proj_errno(P)) { + proj_errno_reset(P); + return proj_coord_error().xyz; + } + return coo.xyz; } @@ -257,5 +268,11 @@ PJ_COORD pj_fwd4d (PJ_COORD coo, PJ *P) { if (!P->skip_fwd_finalize) coo = fwd_finalize (P, coo); + + if (proj_errno(P)) { + proj_errno_reset(P); + return proj_coord_error(); + } + return coo; } diff --git a/src/pj_inv.c b/src/pj_inv.c index 1e84ff30..f9f11f56 100644 --- a/src/pj_inv.c +++ b/src/pj_inv.c @@ -198,6 +198,12 @@ LP pj_inv(XY xy, PJ *P) { if (!P->skip_inv_finalize) coo = inv_finalize (P, coo); + + if (proj_errno(P)) { + proj_errno_reset(P); + return proj_coord_error().lp; + } + return coo.lp; } @@ -228,6 +234,12 @@ LPZ pj_inv3d (XYZ xyz, PJ *P) { if (!P->skip_inv_finalize) coo = inv_finalize (P, coo); + + if (proj_errno(P)) { + proj_errno_reset(P); + return proj_coord_error().lpz; + } + return coo.lpz; } @@ -255,5 +267,11 @@ PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P) { if (!P->skip_inv_finalize) coo = inv_finalize (P, coo); + + if (proj_errno(P)) { + proj_errno_reset(P); + return proj_coord_error(); + } + return coo; } -- cgit v1.2.3 From 22203cc0677f7f60fd81f719125c3c1768e498ac Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Mon, 12 Mar 2018 11:04:35 +0100 Subject: Make sure to pass any existing errno's on after the coordinate operation is done --- src/pj_fwd.c | 38 ++++++++++++++++++++------------------ src/pj_inv.c | 37 +++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/pj_fwd.c b/src/pj_fwd.c index af0aae20..ef05962d 100644 --- a/src/pj_fwd.c +++ b/src/pj_fwd.c @@ -174,11 +174,22 @@ static PJ_COORD fwd_finalize (PJ *P, PJ_COORD coo) { } +static PJ_COORD error_or_coord(PJ *P, PJ_COORD coord, int last_errno) { + if (proj_errno(P)) + return proj_coord_error(); + + proj_errno_restore(P, last_errno); + return coord; +} + XY pj_fwd(LP lp, PJ *P) { + int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.lp = lp; + last_errno = proj_errno_reset(P); + if (!P->skip_fwd_prepare) coo = fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -201,19 +212,18 @@ XY pj_fwd(LP lp, PJ *P) { if (!P->skip_fwd_finalize) coo = fwd_finalize (P, coo); - if (proj_errno(P)) { - proj_errno_reset(P); - return proj_coord_error().xy; - } - - return coo.xy; + return error_or_coord(P, coo, last_errno).xy; } XYZ pj_fwd3d(LPZ lpz, PJ *P) { + int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.lpz = lpz; + + last_errno = proj_errno_reset(P); + if (!P->skip_fwd_prepare) coo = fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -236,17 +246,14 @@ XYZ pj_fwd3d(LPZ lpz, PJ *P) { if (!P->skip_fwd_finalize) coo = fwd_finalize (P, coo); - if (proj_errno(P)) { - proj_errno_reset(P); - return proj_coord_error().xyz; - } - - return coo.xyz; + return error_or_coord(P, coo, last_errno).xyz; } PJ_COORD pj_fwd4d (PJ_COORD coo, PJ *P) { + int last_errno = proj_errno_reset(P); + if (!P->skip_fwd_prepare) coo = fwd_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -269,10 +276,5 @@ PJ_COORD pj_fwd4d (PJ_COORD coo, PJ *P) { if (!P->skip_fwd_finalize) coo = fwd_finalize (P, coo); - if (proj_errno(P)) { - proj_errno_reset(P); - return proj_coord_error(); - } - - return coo; + return error_or_coord(P, coo, last_errno); } diff --git a/src/pj_inv.c b/src/pj_inv.c index f9f11f56..4c2266fb 100644 --- a/src/pj_inv.c +++ b/src/pj_inv.c @@ -172,11 +172,22 @@ static PJ_COORD inv_finalize (PJ *P, PJ_COORD coo) { } +static PJ_COORD error_or_coord(PJ *P, PJ_COORD coord, int last_errno) { + if (proj_errno(P)) + return proj_coord_error(); + + proj_errno_restore(P, last_errno); + return coord; +} + LP pj_inv(XY xy, PJ *P) { + int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.xy = xy; + last_errno = proj_errno_reset(P); + if (!P->skip_inv_prepare) coo = inv_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -199,20 +210,18 @@ LP pj_inv(XY xy, PJ *P) { if (!P->skip_inv_finalize) coo = inv_finalize (P, coo); - if (proj_errno(P)) { - proj_errno_reset(P); - return proj_coord_error().lp; - } - - return coo.lp; + return error_or_coord(P, coo, last_errno).lp; } LPZ pj_inv3d (XYZ xyz, PJ *P) { + int last_errno; PJ_COORD coo = {{0,0,0,0}}; coo.xyz = xyz; + last_errno = proj_errno_reset(P); + if (!P->skip_inv_prepare) coo = inv_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -235,17 +244,14 @@ LPZ pj_inv3d (XYZ xyz, PJ *P) { if (!P->skip_inv_finalize) coo = inv_finalize (P, coo); - if (proj_errno(P)) { - proj_errno_reset(P); - return proj_coord_error().lpz; - } - - return coo.lpz; + return error_or_coord(P, coo, last_errno).lpz; } PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P) { + int last_errno = proj_errno_reset(P); + if (!P->skip_inv_prepare) coo = inv_prepare (P, coo); if (HUGE_VAL==coo.v[0]) @@ -268,10 +274,5 @@ PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P) { if (!P->skip_inv_finalize) coo = inv_finalize (P, coo); - if (proj_errno(P)) { - proj_errno_reset(P); - return proj_coord_error(); - } - - return coo; + return error_or_coord(P, coo, last_errno); } -- cgit v1.2.3