aboutsummaryrefslogtreecommitdiff
path: root/src/PJ_aea.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/PJ_aea.c')
-rw-r--r--src/PJ_aea.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 7d0e935d..228d3afd 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -29,6 +29,7 @@
#define PJ_LIB__
#include <proj.h>
+#include <errno.h>
#include "projects.h"
# define EPS10 1.e-10
@@ -79,23 +80,19 @@ struct pj_opaque {
};
-static void *freeup_new (PJ *P) { /* Destructor */
+static void *destructor (PJ *P, int errlev) { /* Destructor */
if (0==P)
return 0;
if (0==P->opaque)
- return pj_dealloc (P);
+ return pj_default_destructor (P, errlev);
pj_dealloc (P->opaque->en);
- pj_dealloc (P->opaque);
- return pj_dealloc(P);
+ return pj_default_destructor (P, errlev);
}
-static void freeup (PJ *P) {
- freeup_new (P);
- return;
-}
+
static XY e_forward (LP lp, PJ *P) { /* Ellipsoid/spheroid, forward */
@@ -154,17 +151,16 @@ static PJ *setup(PJ *P) {
P->inv = e_inverse;
P->fwd = e_forward;
- if (fabs(Q->phi1 + Q->phi2) < EPS10) {
- proj_errno_set(P, PJD_ERR_CONIC_LAT_EQUAL);
- return freeup_new(P);
- }
+ if (fabs(Q->phi1 + Q->phi2) < EPS10)
+ return destructor(P, PJD_ERR_CONIC_LAT_EQUAL);
Q->n = sinphi = sin(Q->phi1);
cosphi = cos(Q->phi1);
secant = fabs(Q->phi1 - Q->phi2) >= EPS10;
if( (Q->ellips = (P->es > 0.))) {
double ml1, m1;
- if (!(Q->en = pj_enfn(P->es))) return freeup_new(P);
+ if (!(Q->en = pj_enfn(P->es)))
+ return destructor(P, 0);
m1 = pj_msfn(sinphi, cosphi, P->es);
ml1 = pj_qsfn(sinphi, P->e, P->one_es);
if (secant) { /* secant cone */
@@ -175,9 +171,8 @@ static PJ *setup(PJ *P) {
m2 = pj_msfn(sinphi, cosphi, P->es);
ml2 = pj_qsfn(sinphi, P->e, P->one_es);
if (ml2 == ml1)
- {
- return freeup_new(P);
- }
+ return destructor(P, 0);
+
Q->n = (m1 * m1 - m2 * m2) / (ml2 - ml1);
}
Q->ec = 1. - .5 * P->one_es * log((1. - P->e) /
@@ -201,8 +196,9 @@ static PJ *setup(PJ *P) {
PJ *PROJECTION(aea) {
struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
if (0==Q)
- return freeup_new (P);
+ return pj_default_destructor (P, ENOMEM);
P->opaque = Q;
+ P->destructor = destructor;
Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f;
Q->phi2 = pj_param(P->ctx, P->params, "rlat_2").f;
@@ -213,7 +209,7 @@ PJ *PROJECTION(aea) {
PJ *PROJECTION(leac) {
struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
if (0==Q)
- return freeup_new (P);
+ return pj_default_destructor (P, ENOMEM);
P->opaque = Q;
Q->phi2 = pj_param(P->ctx, P->params, "rlat_1").f;