aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2018-03-12 11:04:35 +0100
committerKristian Evers <kristianevers@gmail.com>2018-03-12 12:17:13 +0100
commit22203cc0677f7f60fd81f719125c3c1768e498ac (patch)
treefe5f8b4c526ed181fa0838e39a0f88e10c84b534 /src
parent81efb33bcfc542f558aa95201c046b21a4c9fd12 (diff)
downloadPROJ-22203cc0677f7f60fd81f719125c3c1768e498ac.tar.gz
PROJ-22203cc0677f7f60fd81f719125c3c1768e498ac.zip
Make sure to pass any existing errno's on after the coordinate operation is done
Diffstat (limited to 'src')
-rw-r--r--src/pj_fwd.c38
-rw-r--r--src/pj_inv.c37
2 files changed, 39 insertions, 36 deletions
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);
}