diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-12-15 00:51:46 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2020-12-15 01:13:43 +0100 |
| commit | 244a24104ded3a4573aeffa32160af21f76cbce6 (patch) | |
| tree | f3a11529172719657cf7576e062e45e0f9452db5 /src | |
| parent | 1e9894b0e2b161e61546672bccb85a9ef21df541 (diff) | |
| download | PROJ-244a24104ded3a4573aeffa32160af21f76cbce6.tar.gz PROJ-244a24104ded3a4573aeffa32160af21f76cbce6.zip | |
Revise error codes to have a reduced set exposed in the public API.
Fixes #2482
And also add proj_context_errno_string()
Revise gie 'expect failure errno XXXX' strings
Diffstat (limited to 'src')
124 files changed, 1343 insertions, 985 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp index d6eb901d..612be716 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -176,7 +176,8 @@ double proj_roundtrip (PJ *P, PJ_DIRECTION direction, int n, PJ_COORD *coord) { return HUGE_VAL; if (n < 1) { - proj_errno_set (P, EINVAL); + proj_log_error(P, _("n should be >= 1")); + proj_errno_set (P, PROJ_ERR_OTHER_API_MISUSE); return HUGE_VAL; } @@ -294,7 +295,7 @@ similarly, but prefers the 2D resp. 3D interfaces if available. if( iRetry > 0 ) { const int oldErrno = proj_errno_reset(P); if (proj_log_level(P->ctx, PJ_LOG_TELL) >= PJ_LOG_DEBUG) { - pj_log(P->ctx, PJ_LOG_DEBUG, proj_errno_string(oldErrno)); + pj_log(P->ctx, PJ_LOG_DEBUG, proj_context_errno_string(P->ctx, oldErrno)); } pj_log(P->ctx, PJ_LOG_DEBUG, "Did not result in valid result. " @@ -312,7 +313,7 @@ similarly, but prefers the 2D resp. 3D interfaces if available. } PJ_COORD res = direction == PJ_FWD ? pj_fwd4d( coord, alt.pj ) : pj_inv4d( coord, alt.pj ); - if( proj_errno(alt.pj) == PJD_ERR_NETWORK_ERROR ) { + if( proj_errno(alt.pj) == PROJ_ERR_OTHER_NETWORK_ERROR ) { return proj_coord_error (); } if( res.xyzt.x != HUGE_VAL ) { @@ -359,21 +360,14 @@ similarly, but prefers the 2D resp. 3D interfaces if available. } } - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_NO_OPERATION); return proj_coord_error (); } - switch (direction) { - case PJ_FWD: - return pj_fwd4d (coord, P); - case PJ_INV: - return pj_inv4d (coord, P); - default: - break; - } - - proj_errno_set (P, EINVAL); - return proj_coord_error (); + if (direction == PJ_FWD) + return pj_fwd4d (coord, P); + else + return pj_inv4d (coord, P); } @@ -500,9 +494,6 @@ size_t proj_trans_generic ( break; case PJ_IDENT: return nmin; - default: - proj_errno_set (P, EINVAL); - return 0; } /* Arrays of length==0 are broadcast as the constant 0 */ @@ -771,7 +762,7 @@ PJ *pj_create_internal (PJ_CONTEXT *ctx, const char *definition) { n = strlen (definition); args = (char *) malloc (n + 1); if (nullptr==args) { - proj_context_errno_set(ctx, ENOMEM); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } strcpy (args, definition); @@ -779,14 +770,14 @@ PJ *pj_create_internal (PJ_CONTEXT *ctx, const char *definition) { argc = pj_trim_argc (args); if (argc==0) { free (args); - proj_context_errno_set(ctx, PJD_ERR_NO_ARGS); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP_MISSING_ARG); return nullptr; } argv = pj_trim_argv (argc, args); if (!argv) { free(args); - proj_context_errno_set(ctx, ENOMEM); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } @@ -821,14 +812,14 @@ indicator, as in {"+proj=utm", "+zone=32"}, or leave it out, as in {"proj=utm", if (nullptr==ctx) ctx = pj_get_default_ctx (); if (nullptr==argv) { - proj_context_errno_set(ctx, PJD_ERR_NO_ARGS); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP_MISSING_ARG); return nullptr; } /* We assume that free format is used, and build a full proj_create compatible string */ c = pj_make_args (argc, argv); if (nullptr==c) { - proj_context_errno_set(ctx, ENOMEM); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP /* ENOMEM */); return nullptr; } @@ -849,14 +840,14 @@ Same as proj_create_argv() but calls pj_create_internal() instead of proj_create if (nullptr==ctx) ctx = pj_get_default_ctx (); if (nullptr==argv) { - proj_context_errno_set(ctx, PJD_ERR_NO_ARGS); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP_MISSING_ARG); return nullptr; } /* We assume that free format is used, and build a full proj_create compatible string */ c = pj_make_args (argc, argv); if (nullptr==c) { - proj_context_errno_set(ctx, ENOMEM); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } diff --git a/src/aasincos.cpp b/src/aasincos.cpp index c4314c67..ca33663b 100644 --- a/src/aasincos.cpp +++ b/src/aasincos.cpp @@ -14,7 +14,7 @@ aasin(PJ_CONTEXT *ctx,double v) { if ((av = fabs(v)) >= 1.) { if (av > ONE_TOL) - proj_context_errno_set( ctx, PJD_ERR_ACOS_ASIN_ARG_TOO_LARGE ); + proj_context_errno_set( ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); return (v < 0. ? -M_HALFPI : M_HALFPI); } return asin(v); @@ -26,7 +26,7 @@ aacos(PJ_CONTEXT *ctx, double v) { if ((av = fabs(v)) >= 1.) { if (av > ONE_TOL) - proj_context_errno_set( ctx, PJD_ERR_ACOS_ASIN_ARG_TOO_LARGE ); + proj_context_errno_set( ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); return (v < 0. ? M_PI : 0.); } return acos(v); diff --git a/src/apps/gie.cpp b/src/apps/gie.cpp index b504b922..95c7da34 100644 --- a/src/apps/gie.cpp +++ b/src/apps/gie.cpp @@ -951,7 +951,15 @@ Tell GIE what to expect, when transforming the ACCEPTed input if (expect_failure_with_errno) { if (proj_errno (T.P)==expect_failure_with_errno) return another_succeeding_failure (); - fprintf (T.fout, "errno=%d, expected=%d\n", proj_errno (T.P), expect_failure_with_errno); + //fprintf (T.fout, "errno=%d, expected=%d\n", proj_errno (T.P), expect_failure_with_errno); + banner (T.operation); + errmsg (3, "%serrno=%s (%d), expected=%d at line %d\n", + delim, + err_const_from_errno(proj_errno(T.P)), + proj_errno (T.P), + expect_failure_with_errno, + F->lineno + ); return another_failing_failure (); } @@ -1107,85 +1115,32 @@ static int dispatch (const char *cmnd, const char *args) { namespace { // anonymous namespace struct errno_vs_err_const {const char *the_err_const; int the_errno;}; static const struct errno_vs_err_const lookup[] = { - {"pjd_err_no_args" , -1}, - {"pjd_err_no_option_in_init_file" , -2}, - {"pjd_err_no_colon_in_init_string" , -3}, - {"pjd_err_proj_not_named" , -4}, - {"pjd_err_unknown_projection_id" , -5}, - {"pjd_err_invalid_eccentricity" , -6}, - {"pjd_err_unknown_unit_id" , -7}, - {"pjd_err_invalid_boolean_param" , -8}, - {"pjd_err_unknown_ellp_param" , -9}, - {"pjd_err_rev_flattening_is_zero" , -10}, - {"pjd_err_ref_rad_larger_than_90" , -11}, - {"pjd_err_es_less_than_zero" , -12}, - {"pjd_err_major_axis_not_given" , -13}, - {"pjd_err_lat_or_lon_exceed_limit" , -14}, - {"pjd_err_invalid_x_or_y" , -15}, - {"pjd_err_wrong_format_dms_value" , -16}, - {"pjd_err_non_conv_inv_meri_dist" , -17}, - {"pjd_err_non_conv_sinhpsi2tanphi" , -18}, - {"pjd_err_acos_asin_arg_too_large" , -19}, - {"pjd_err_tolerance_condition" , -20}, - {"pjd_err_conic_lat_equal" , -21}, - {"pjd_err_lat_larger_than_90" , -22}, - {"pjd_err_lat1_is_zero" , -23}, - {"pjd_err_lat_ts_larger_than_90" , -24}, - {"pjd_err_control_point_no_dist" , -25}, - {"pjd_err_no_rotation_proj" , -26}, - {"pjd_err_w_or_m_zero_or_less" , -27}, - {"pjd_err_lsat_not_in_range" , -28}, - {"pjd_err_path_not_in_range" , -29}, - {"pjd_err_invalid_h" , -30}, - {"pjd_err_k_less_than_zero" , -31}, - {"pjd_err_lat_1_or_2_zero_or_90" , -32}, - {"pjd_err_lat_0_or_alpha_eq_90" , -33}, - {"pjd_err_ellipsoid_use_required" , -34}, - {"pjd_err_invalid_utm_zone" , -35}, - {"" , -36}, /* no longer used */ - {"pjd_err_failed_to_find_proj" , -37}, - {"pjd_err_failed_to_load_grid" , -38}, - {"pjd_err_invalid_m_or_n" , -39}, - {"pjd_err_n_out_of_range" , -40}, - {"pjd_err_lat_1_2_unspecified" , -41}, - {"pjd_err_abs_lat1_eq_abs_lat2" , -42}, - {"pjd_err_lat_0_half_pi_from_mean" , -43}, - {"pjd_err_unparseable_cs_def" , -44}, - {"pjd_err_geocentric" , -45}, - {"pjd_err_unknown_prime_meridian" , -46}, - {"pjd_err_axis" , -47}, - {"pjd_err_grid_area" , -48}, - {"pjd_err_invalid_sweep_axis" , -49}, - {"pjd_err_malformed_pipeline" , -50}, - {"pjd_err_unit_factor_less_than_0" , -51}, - {"pjd_err_invalid_scale" , -52}, - {"pjd_err_non_convergent" , -53}, - {"pjd_err_missing_args" , -54}, - {"pjd_err_lat_0_is_zero" , -55}, - {"pjd_err_ellipsoidal_unsupported" , -56}, - {"pjd_err_too_many_inits" , -57}, - {"pjd_err_invalid_arg" , -58}, - {"pjd_err_inconsistent_unit" , -59}, - {"pjd_err_mutually_exclusive_args" , -60}, - {"pjd_err_generic_error" , -61}, - {"pjd_err_network_error" , -62}, - {"pjd_err_dont_skip" , 5555}, - {"pjd_err_unknown" , 9999}, - {"pjd_err_enomem" , ENOMEM}, + + { "invalid_op", PROJ_ERR_INVALID_OP }, + { "invalid_op_wrong_syntax", PROJ_ERR_INVALID_OP_WRONG_SYNTAX }, + { "invalid_op_missing_arg", PROJ_ERR_INVALID_OP_MISSING_ARG }, + { "invalid_op_illegal_arg_value", PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE }, + { "invalid_op_mutually_exclusive_args", PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS }, + { "invalid_op_file_not_found_or_invalid", PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID }, + { "coord_transfm", PROJ_ERR_COORD_TRANSFM }, + { "coord_transfm_invalid_coord", PROJ_ERR_COORD_TRANSFM_INVALID_COORD }, + { "coord_transfm_outside_projection_domain", PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN }, + { "coord_transfm_no_operation", PROJ_ERR_COORD_TRANSFM_NO_OPERATION }, + { "coord_transfm_outside_grid", PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID }, + { "coord_transfm_grid_at_nodata", PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA }, + { "other", PROJ_ERR_OTHER }, + { "api_misuse", PROJ_ERR_OTHER_API_MISUSE }, + { "no_inverse_op", PROJ_ERR_OTHER_NO_INVERSE_OP }, + { "network_error", PROJ_ERR_OTHER_NETWORK_ERROR }, }; } // anonymous namespace -static const struct errno_vs_err_const unknown = {"PJD_ERR_UNKNOWN", 9999}; - - static int list_err_codes (void) { int i; const int n = sizeof lookup / sizeof lookup[0]; for (i = 0; i < n; i++) { - if (9999==lookup[i].the_errno) - break; - fprintf (T.fout, "%25s (%2.2d): %s\n", lookup[i].the_err_const + 8, + fprintf (T.fout, "%25s (%2.2d): %s\n", lookup[i].the_err_const, lookup[i].the_errno, proj_errno_string (lookup[i].the_errno)); } return 0; @@ -1198,9 +1153,9 @@ static const char *err_const_from_errno (int err) { for (i = 0; i < n; i++) { if (err==lookup[i].the_errno) - return lookup[i].the_err_const + 8; + return lookup[i].the_err_const; } - return unknown.the_err_const; + return "unknown"; } @@ -1226,14 +1181,6 @@ static int errno_from_err_const (const char *err_const) { /* Else try to find a matching identifier */ len = strlen (tolower_err_const); - /* First try to find a match excluding the PJD_ERR_ prefix */ - for (i = 0; i < n; i++) { - if (strlen(lookup[i].the_err_const) > 8 && - 0==strncmp (lookup[i].the_err_const + 8, err_const, len)) - return lookup[i].the_errno; - } - - /* If that did not work, try with the full name */ for (i = 0; i < n; i++) { if (0==strncmp (lookup[i].the_err_const, err_const, len)) return lookup[i].the_errno; diff --git a/src/conversions/axisswap.cpp b/src/conversions/axisswap.cpp index 1aa339c3..c02bd4e5 100644 --- a/src/conversions/axisswap.cpp +++ b/src/conversions/axisswap.cpp @@ -174,13 +174,16 @@ PJ *CONVERSION(axisswap,0) { unsigned int i, j, n = 0; if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = (void *) Q; /* +order and +axis are mutually exclusive */ if ( !pj_param_exists(P->params, "order") == !pj_param_exists(P->params, "axis") ) - return pj_default_destructor(P, PJD_ERR_AXIS); + { + proj_log_error(P, _("order and axis parameters are mutually exclusive.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS); + } /* fill axis list with indices from 4-7 to simplify duplicate search further down */ for (i=0; i<4; i++) { @@ -196,8 +199,8 @@ PJ *CONVERSION(axisswap,0) { /* check that all characters are valid */ for (i=0; i<strlen(order); i++) if (strchr("1234-,", order[i]) == nullptr) { - proj_log_error(P, "axisswap: unknown axis '%c'", order[i]); - return pj_default_destructor(P, PJD_ERR_AXIS); + proj_log_error(P, _("axisswap: unknown axis '%c'"), order[i]); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } /* read axes numbers and signs */ @@ -206,8 +209,8 @@ PJ *CONVERSION(axisswap,0) { while ( *s != '\0' && n < 4 ) { Q->axis[n] = abs(atoi(s))-1; if (Q->axis[n] > 3) { - proj_log_error(P, "axisswap: invalid axis '%d'", Q->axis[n]); - return pj_default_destructor(P, PJD_ERR_AXIS); + proj_log_error(P, _("axisswap: invalid axis '%d'"), Q->axis[n]); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->sign[n++] = sign(atoi(s)); while ( *s != '\0' && *s != ',' ) @@ -247,8 +250,8 @@ PJ *CONVERSION(axisswap,0) { Q->axis[i] = 2; break; default: - proj_log_error(P, "axisswap: unknown axis '%c'", P->axis[i]); - return pj_default_destructor(P, PJD_ERR_AXIS); + proj_log_error(P, _("axisswap: unknown axis '%c'"), P->axis[i]); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } n = 3; @@ -260,8 +263,8 @@ PJ *CONVERSION(axisswap,0) { if (i==j) continue; if (Q->axis[i] == Q->axis[j]) { - proj_log_error(P, "swapaxis: duplicate axes specified"); - return pj_default_destructor(P, PJD_ERR_AXIS); + proj_log_error(P, _("swapaxis: duplicate axes specified")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } @@ -282,8 +285,8 @@ PJ *CONVERSION(axisswap,0) { if (P->fwd4d == nullptr && P->fwd3d == nullptr && P->fwd == nullptr) { - proj_log_error(P, "swapaxis: bad axis order"); - return pj_default_destructor(P, PJD_ERR_AXIS); + proj_log_error(P, _("swapaxis: bad axis order")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } if (pj_param(P->ctx, P->params, "tangularunits").i) { diff --git a/src/conversions/set.cpp b/src/conversions/set.cpp index 2f30bda8..3db6db10 100644 --- a/src/conversions/set.cpp +++ b/src/conversions/set.cpp @@ -42,7 +42,7 @@ PJ *OPERATION(set, 0) { auto set = static_cast<struct Set*>(calloc (1, sizeof(struct Set))); P->opaque = set; if (nullptr==P->opaque) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); if (pj_param_exists(P->params, "v_1")) { diff --git a/src/conversions/topocentric.cpp b/src/conversions/topocentric.cpp index f6f328ad..4f563d9f 100644 --- a/src/conversions/topocentric.cpp +++ b/src/conversions/topocentric.cpp @@ -78,7 +78,7 @@ PJ *CONVERSION(topocentric,1) { /*********************************************************************/ struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = static_cast<void *>(Q); // The topocentric origin can be specified either in geocentric coordinates @@ -97,26 +97,30 @@ PJ *CONVERSION(topocentric,1) { const auto hash0 = pj_param_exists(P->params, "h_0"); if( !hasX0 && !hasLon0 ) { - return pj_default_destructor(P, PJD_ERR_MISSING_ARGS); + proj_log_error(P, _("topocentric: missing X_0 or lon_0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } if ( (hasX0 || hasY0 || hasZ0) && (hasLon0 || hasLat0 || hash0) ) { - return pj_default_destructor(P, PJD_ERR_MUTUALLY_EXCLUSIVE_ARGS); + proj_log_error(P, _("topocentric: (X_0,Y_0,Z_0) and (lon_0,lat_0,h_0) are mutually exclusive")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS); } if( hasX0 && (!hasY0 || !hasZ0) ) { - return pj_default_destructor(P, PJD_ERR_MISSING_ARGS); + proj_log_error(P, _("topocentric: missing Y_0 and/or Z_0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } if( hasLon0 && !hasLat0 ) // allow missing h_0 { - return pj_default_destructor(P, PJD_ERR_MISSING_ARGS); + proj_log_error(P, _("topocentric: missing lat_0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } // Pass a dummy ellipsoid definition that will be overridden just afterwards PJ* cart = proj_create(P->ctx, "+proj=cart +a=1"); if (cart == nullptr) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); /* inherit ellipsoid definition from P to cart */ pj_inherit_ellipsoid_def (P, cart); diff --git a/src/conversions/unitconvert.cpp b/src/conversions/unitconvert.cpp index 61bccbf1..fec8caac 100644 --- a/src/conversions/unitconvert.cpp +++ b/src/conversions/unitconvert.cpp @@ -443,7 +443,7 @@ PJ *CONVERSION(unitconvert,0) { int z_out_is_linear = -1; /* unknown */ if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = (void *) Q; P->fwd4d = forward_4d; @@ -473,7 +473,10 @@ PJ *CONVERSION(unitconvert,0) { } else { f = pj_param (P->ctx, P->params, "dxy_in").f; if (f == 0.0 || 1.0 / f == 0.0) - return pj_default_destructor(P, PJD_ERR_UNKNOWN_UNIT_ID); + { + proj_log_error(P, _("unitconvert: unknown xy_in unit")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } Q->xy_factor = f; if (normalized_name != nullptr) { @@ -492,7 +495,10 @@ PJ *CONVERSION(unitconvert,0) { } else { f = pj_param (P->ctx, P->params, "dxy_out").f; if (f == 0.0 || 1.0 / f == 0.0) - return pj_default_destructor(P, PJD_ERR_UNKNOWN_UNIT_ID); + { + proj_log_error(P, _("unitconvert: unknown xy_out unit")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } Q->xy_factor /= f; if (normalized_name != nullptr) { @@ -505,8 +511,8 @@ PJ *CONVERSION(unitconvert,0) { if( xy_in_is_linear >= 0 && xy_out_is_linear >= 0 && xy_in_is_linear != xy_out_is_linear ) { - proj_log_debug(P, "inconsistent unit type between xy_in and xy_out"); - return pj_default_destructor(P, PJD_ERR_INCONSISTENT_UNIT); + proj_log_error(P, _("unitconvert: inconsistent unit type between xy_in and xy_out")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } if ((name = pj_param (P->ctx, P->params, "sz_in").s) != nullptr) { @@ -517,7 +523,10 @@ PJ *CONVERSION(unitconvert,0) { } else { f = pj_param (P->ctx, P->params, "dz_in").f; if (f == 0.0 || 1.0 / f == 0.0) - return pj_default_destructor(P, PJD_ERR_UNKNOWN_UNIT_ID); + { + proj_log_error(P, _("unitconvert: unknown z_in unit")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } Q->z_factor = f; } @@ -530,21 +539,28 @@ PJ *CONVERSION(unitconvert,0) { } else { f = pj_param (P->ctx, P->params, "dz_out").f; if (f == 0.0 || 1.0 / f == 0.0) - return pj_default_destructor(P, PJD_ERR_UNKNOWN_UNIT_ID); + { + proj_log_error(P, _("unitconvert: unknown z_out unit")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } Q->z_factor /= f; } if( z_in_is_linear >= 0 && z_out_is_linear >= 0 && z_in_is_linear != z_out_is_linear ) { - proj_log_debug(P, "inconsistent unit type between z_in and z_out"); - return pj_default_destructor(P, PJD_ERR_INCONSISTENT_UNIT); + proj_log_error(P, _("unitconvert: inconsistent unit type between z_in and z_out")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } if ((name = pj_param (P->ctx, P->params, "st_in").s) != nullptr) { for (i = 0; (s = time_units[i].id) && strcmp(name, s) ; ++i); - if (!s) return pj_default_destructor(P, PJD_ERR_UNKNOWN_UNIT_ID); /* unknown unit conversion id */ + if (!s) + { + proj_log_error(P, _("unitconvert: unknown t_in unit")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->t_in_id = i; proj_log_trace(P, "t_in unit: %s", time_units[i].name); @@ -554,7 +570,11 @@ PJ *CONVERSION(unitconvert,0) { if ((name = pj_param (P->ctx, P->params, "st_out").s) != nullptr) { for (i = 0; (s = time_units[i].id) && strcmp(name, s) ; ++i); - if (!s) return pj_default_destructor(P, PJD_ERR_UNKNOWN_UNIT_ID); /* unknown unit conversion id */ + if (!s) + { + proj_log_error(P, _("unitconvert: unknown t_out unit")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->t_out_id = i; proj_log_trace(P, "t_out unit: %s", time_units[i].name); diff --git a/src/datum_set.cpp b/src/datum_set.cpp index 3f612633..e7853a53 100644 --- a/src/datum_set.cpp +++ b/src/datum_set.cpp @@ -25,7 +25,6 @@ * DEALINGS IN THE SOFTWARE. *****************************************************************************/ -#include <errno.h> #include <string.h> #include "proj.h" @@ -71,7 +70,8 @@ int pj_datum_set(PJ_CONTEXT *ctx, paralist *pl, PJ *projdef) for (i = 0; (s = pj_datums[i].id) && strcmp(name, s) ; ++i) {} if (!s) { - proj_context_errno_set(ctx, PJD_ERR_UNKNOWN_ELLP_PARAM); + pj_log (ctx, PJ_LOG_ERROR, _("Unknown value for datum")); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); return 1; } @@ -87,7 +87,7 @@ int pj_datum_set(PJ_CONTEXT *ctx, paralist *pl, PJ *projdef) auto param = pj_mkparam(entry); if (nullptr == param) { - proj_context_errno_set(ctx, ENOMEM); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP /*ENOMEM*/); return 1; } curr->next = param; @@ -99,7 +99,7 @@ int pj_datum_set(PJ_CONTEXT *ctx, paralist *pl, PJ *projdef) auto param = pj_mkparam(pj_datums[i].defn); if (nullptr == param) { - proj_context_errno_set(ctx, ENOMEM); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP /*ENOMEM*/); return 1; } curr->next = param; diff --git a/src/dmstor.cpp b/src/dmstor.cpp index 24887a11..4c7408cf 100644 --- a/src/dmstor.cpp +++ b/src/dmstor.cpp @@ -61,7 +61,7 @@ dmstor_ctx(PJ_CONTEXT *ctx, const char *is, char **rs) { n = 2; break; case 'r': case 'R': if (nl) { - proj_context_errno_set( ctx, PJD_ERR_WRONG_FORMAT_DMS_VALUE ); + proj_context_errno_set( ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE ); return HUGE_VAL; } ++s; @@ -73,7 +73,7 @@ dmstor_ctx(PJ_CONTEXT *ctx, const char *is, char **rs) { continue; } if (n < nl) { - proj_context_errno_set( ctx, PJD_ERR_WRONG_FORMAT_DMS_VALUE ); + proj_context_errno_set( ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE ); return HUGE_VAL; } v += tv * vm[n]; diff --git a/src/ell_set.cpp b/src/ell_set.cpp index afa962c5..a3e7d650 100644 --- a/src/ell_set.cpp +++ b/src/ell_set.cpp @@ -1,6 +1,5 @@ /* set ellipsoid parameters a and es */ -#include <errno.h> #include <math.h> #include <stddef.h> #include <string.h> @@ -147,23 +146,29 @@ static int ellps_ellps (PJ *P) { /* Then look up the right size and shape parameters from the builtin list */ if (strlen (par->param) < 7) - return proj_errno_set (P, PJD_ERR_INVALID_ARG); + { + proj_log_error(P, _("Invalid value for +ellps")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } name = par->param + 6; ellps = pj_find_ellps (name); if (nullptr==ellps) - return proj_errno_set (P, PJD_ERR_UNKNOWN_ELLP_PARAM); + { + proj_log_error(P, _("Unrecognized value for +ellps")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } /* Now, get things ready for ellps_size/ellps_shape, make them do their thing */ err = proj_errno_reset (P); paralist* new_params = pj_mkparam (ellps->major); if (nullptr == new_params) - return proj_errno_set (P, ENOMEM); + return proj_errno_set (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); new_params->next = pj_mkparam (ellps->ell); if (nullptr == new_params->next) { free(new_params); - return proj_errno_set (P, ENOMEM); + return proj_errno_set (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } paralist* old_params = P->params; P->params = new_params; @@ -207,15 +212,26 @@ static int ellps_size (PJ *P) { if (nullptr==par) par = pj_get_param (P->params, "a"); if (nullptr==par) - return a_was_set? 0: proj_errno_set (P, PJD_ERR_MAJOR_AXIS_NOT_GIVEN); + { + if( a_was_set ) + return 0; + proj_log_error(P, _("Major axis not given")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } P->def_size = pj_strdup(par->param); par->used = 1; P->a = pj_atof (pj_param_value (par)); if (P->a <= 0) - return proj_errno_set (P, PJD_ERR_MAJOR_AXIS_NOT_GIVEN); + { + proj_log_error(P, _("Invalid value for major axis")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (HUGE_VAL==P->a) - return proj_errno_set (P, PJD_ERR_MAJOR_AXIS_NOT_GIVEN); + { + proj_log_error(P, _("Invalid value for major axis")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if ('R'==par->param[0]) { P->es = P->f = P->e = P->rf = 0; @@ -264,10 +280,11 @@ static int ellps_shape (PJ *P) { /* reverse flattening, rf */ case 0: P->rf = pj_atof (pj_param_value (par)); - if (HUGE_VAL==P->rf) - return proj_errno_set (P, PJD_ERR_INVALID_ARG); - if (0==P->rf) - return proj_errno_set (P, PJD_ERR_REV_FLATTENING_IS_ZERO); + if (HUGE_VAL==P->rf || P->rf <= 0) + { + proj_log_error(P, _("Invalid value for rf. Should be > 0")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } P->f = 1 / P->rf; P->es = 2*P->f - P->f*P->f; break; @@ -275,8 +292,11 @@ static int ellps_shape (PJ *P) { /* flattening, f */ case 1: P->f = pj_atof (pj_param_value (par)); - if (HUGE_VAL==P->f) - return proj_errno_set (P, PJD_ERR_INVALID_ARG); + if (HUGE_VAL==P->f || P->f < 0) + { + proj_log_error(P, _("Invalid value for f. Should be >= 0")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } P->rf = P->f != 0.0 ? 1.0/P->f: HUGE_VAL; P->es = 2*P->f - P->f*P->f; @@ -285,42 +305,49 @@ static int ellps_shape (PJ *P) { /* eccentricity squared, es */ case 2: P->es = pj_atof (pj_param_value (par)); - if (HUGE_VAL==P->es) - return proj_errno_set (P, PJD_ERR_INVALID_ARG); - if (P->es >= 1) - return proj_errno_set (P, PJD_ERR_INVALID_ECCENTRICITY); + if (HUGE_VAL==P->es || P->es < 0 || P->es >= 1) + { + proj_log_error(P, _("Invalid value for es. Should be in [0,1[ range")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } break; /* eccentricity, e */ case 3: P->e = pj_atof (pj_param_value (par)); - if (HUGE_VAL==P->e) - return proj_errno_set (P, PJD_ERR_INVALID_ARG); - if (P->e < 0 || P->e >= 1) - return proj_errno_set (P, PJD_ERR_INVALID_ECCENTRICITY); + if (HUGE_VAL==P->e || P->e < 0 || P->e >= 1) + { + proj_log_error(P, _("Invalid value for e. Should be in [0,1[ range")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } P->es = P->e * P->e; break; /* semiminor axis, b */ case 4: P->b = pj_atof (pj_param_value (par)); - if (HUGE_VAL==P->b) - return proj_errno_set (P, PJD_ERR_INVALID_ARG); - if (P->b <= 0) - return proj_errno_set (P, PJD_ERR_INVALID_ECCENTRICITY); + if (HUGE_VAL==P->b || P->b <= 0) + { + proj_log_error(P, _("Invalid value for b. Should be > 0")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (P->b==P->a) break; P->f = (P->a - P->b) / P->a; P->es = 2*P->f - P->f*P->f; break; default: - return PJD_ERR_INVALID_ARG; + // shouldn't happen + return PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; } // Written that way to catch NaN if (!(P->es >= 0)) - return proj_errno_set (P, PJD_ERR_ES_LESS_THAN_ZERO); + { + proj_log_error(P, _("Invalid eccentricity")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } return 0; } @@ -384,7 +411,7 @@ static int ellps_spherification (PJ *P) { /* R_h - a sphere with R = the harmonic mean of the ellipsoid */ case 4: if (P->a + P->b == 0) - return proj_errno_set (P, PJD_ERR_TOLERANCE_CONDITION); + return proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); P->a = (2*P->a * P->b) / (P->a + P->b); break; @@ -395,11 +422,15 @@ static int ellps_spherification (PJ *P) { v = pj_param_value (par); t = proj_dmstor (v, &endp); if (fabs (t) > M_HALFPI) - return proj_errno_set (P, PJD_ERR_REF_RAD_LARGER_THAN_90); + { + proj_log_error(P, _("Invalid value for lat_g. |lat_g| should be <= 90°")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } t = sin (t); t = 1 - P->es * t * t; if (t == 0.) { - return proj_errno_set(P, PJD_ERR_INVALID_ECCENTRICITY); + proj_log_error(P, _("Invalid eccentricity")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } if (i==5) /* arithmetic */ P->a *= (1. - P->es + t) / (2 * t * sqrt(t)); @@ -409,7 +440,8 @@ static int ellps_spherification (PJ *P) { } if (P->a <= 0.) { - return proj_errno_set(P, PJD_ERR_MAJOR_AXIS_NOT_GIVEN); + proj_log_error(P, _("Invalid or missing major axis")); + return proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } /* Clean up the ellipsoidal parameters to reflect the sphere */ @@ -552,8 +584,9 @@ int pj_calc_ellipsoid_params (PJ *P, double a, double es) { if (0==P->f) P->f = 1 - cos (P->alpha); /* = 1 - sqrt (1 - PIN->es); */ if (P->f == 1.0) { - proj_context_errno_set( P->ctx, PJD_ERR_INVALID_ECCENTRICITY); - return PJD_ERR_INVALID_ECCENTRICITY; + proj_log_error(P, _("Invalid eccentricity")); + proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + return PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; } P->rf = P->f != 0.0 ? 1.0/P->f: HUGE_VAL; @@ -573,8 +606,9 @@ int pj_calc_ellipsoid_params (PJ *P, double a, double es) { P->one_es = 1. - P->es; if (P->one_es == 0.) { - proj_context_errno_set( P->ctx, PJD_ERR_INVALID_ECCENTRICITY); - return PJD_ERR_INVALID_ECCENTRICITY; + proj_log_error(P, _("Invalid eccentricity")); + proj_errno_set (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + return PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; } P->rone_es = 1./P->one_es; diff --git a/src/factors.cpp b/src/factors.cpp index ff733d07..d6c24f01 100644 --- a/src/factors.cpp +++ b/src/factors.cpp @@ -36,8 +36,15 @@ int pj_factors(PJ_LP lp, const PJ *P, double h, struct FACTORS *fac) { fac->code = 0; /* Check for latitude or longitude overange */ - if ((fabs (lp.phi)-M_HALFPI) > EPS || fabs (lp.lam) > 10.) { - proj_errno_set (P, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT); + if ((fabs (lp.phi)-M_HALFPI) > EPS ) + { + proj_log_error(P, _("Invalid latitude")); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); + return 1; + } + if( fabs (lp.lam) > 10.) { + proj_log_error(P, _("Invalid longitude")); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); return 1; } @@ -62,7 +69,8 @@ int pj_factors(PJ_LP lp, const PJ *P, double h, struct FACTORS *fac) { /* Derivatives */ if (pj_deriv (lp, h, P, &(fac->der))) { - proj_errno_set (P, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT); + proj_log_error(P, _("Invalid latitude or longitude")); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); return 1; } diff --git a/src/fwd.cpp b/src/fwd.cpp index 962a5051..97ba5999 100644 --- a/src/fwd.cpp +++ b/src/fwd.cpp @@ -52,10 +52,19 @@ static PJ_COORD fwd_prepare (PJ *P, PJ_COORD coo) { /* check for latitude or longitude over-range */ t = (coo.lp.phi < 0 ? -coo.lp.phi : coo.lp.phi) - M_HALFPI; - if (t > PJ_EPS_LAT || coo.lp.lam > 10 || coo.lp.lam < -10) { - proj_errno_set (P, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT); + if (t > PJ_EPS_LAT) + { + proj_log_error(P, _("Invalid latitude")); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); return proj_coord_error (); } + if (coo.lp.lam > 10 || coo.lp.lam < -10) + { + proj_log_error(P, _("Invalid longitude")); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_INVALID_COORD); + return proj_coord_error (); + } + /* Clamp latitude to -90..90 degree range */ if (coo.lp.phi > M_HALFPI) @@ -186,7 +195,7 @@ PJ_XY pj_fwd(PJ_LP lp, PJ *P) { else if (P->fwd4d) coo = P->fwd4d (coo, P); else { - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_OTHER_NO_INVERSE_OP); return proj_coord_error ().xy; } if (HUGE_VAL==coo.v[0]) @@ -220,7 +229,7 @@ PJ_XYZ pj_fwd3d(PJ_LPZ lpz, PJ *P) { else if (P->fwd) coo.xy = P->fwd (coo.lp, P); else { - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_OTHER_NO_INVERSE_OP); return proj_coord_error ().xyz; } if (HUGE_VAL==coo.v[0]) @@ -250,7 +259,7 @@ PJ_COORD pj_fwd4d (PJ_COORD coo, PJ *P) { else if (P->fwd) coo.xy = P->fwd (coo.lp, P); else { - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_OTHER_NO_INVERSE_OP); return proj_coord_error (); } if (HUGE_VAL==coo.v[0]) diff --git a/src/gauss.cpp b/src/gauss.cpp index 96bd5166..07d0433a 100644 --- a/src/gauss.cpp +++ b/src/gauss.cpp @@ -109,6 +109,6 @@ PJ_LP pj_inv_gauss(PJ_CONTEXT *ctx, PJ_LP slp, const void *data) { } /* convergence failed */ if (!i) - proj_context_errno_set(ctx, PJD_ERR_NON_CONV_INV_MERI_DIST); + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return (elp); } diff --git a/src/generic_inverse.cpp b/src/generic_inverse.cpp index ddd5060b..41cf6c50 100644 --- a/src/generic_inverse.cpp +++ b/src/generic_inverse.cpp @@ -109,6 +109,7 @@ PJ_LP pj_generic_inverse_2d(PJ_XY xy, PJ *P, PJ_LP lpInitial) { lp.phi = M_HALFPI; } } - proj_context_errno_set(P->ctx, PJD_ERR_NON_CONVERGENT); + proj_context_errno_set(P->ctx, + PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } diff --git a/src/grids.cpp b/src/grids.cpp index 871e21ed..fb5966eb 100644 --- a/src/grids.cpp +++ b/src/grids.cpp @@ -197,7 +197,9 @@ GTXVerticalShiftGrid *GTXVerticalShiftGrid::open(PJ_CONTEXT *ctx, /* Read the header. */ /* -------------------------------------------------------------------- */ if (fp->read(header, sizeof(header)) != sizeof(header)) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + pj_log(ctx, PJ_LOG_ERROR, _("Cannot read grid header")); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -222,8 +224,9 @@ GTXVerticalShiftGrid *GTXVerticalShiftGrid::open(PJ_CONTEXT *ctx, if (xorigin < -360 || xorigin > 360 || yorigin < -90 || yorigin > 90) { pj_log(ctx, PJ_LOG_ERROR, - "gtx file header has invalid extents, corrupt?"); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + _("gtx file header has invalid extents, corrupt?")); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -258,7 +261,8 @@ bool GTXVerticalShiftGrid::valueAt(int x, int y, float &out) const { m_fp->seek(40 + sizeof(float) * (y * m_width + x)); if (m_fp->read(&out, sizeof(out)) != sizeof(out)) { - proj_context_errno_set(m_ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(m_ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return false; } if (IS_LSB) { @@ -621,7 +625,7 @@ bool GTiffGrid::valueAt(uint16 sample, int x, int yFromBottom, try { m_buffer.resize(blockSize); } catch (const std::exception &e) { - pj_log(m_ctx, PJ_LOG_ERROR, "Exception %s", e.what()); + pj_log(m_ctx, PJ_LOG_ERROR, _("Exception %s"), e.what()); return false; } } @@ -642,7 +646,7 @@ bool GTiffGrid::valueAt(uint16 sample, int x, int yFromBottom, m_cache.insert(m_ifdIdx, blockId, m_buffer); } catch (const std::exception &e) { // Should normally not happen - pj_log(m_ctx, PJ_LOG_ERROR, "Exception %s", e.what()); + pj_log(m_ctx, PJ_LOG_ERROR, _("Exception %s"), e.what()); } } @@ -847,35 +851,35 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { TIFFGetField(m_hTIFF, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(m_hTIFF, TIFFTAG_IMAGELENGTH, &height); if (width == 0 || height == 0 || width > INT_MAX || height > INT_MAX) { - pj_log(m_ctx, PJ_LOG_ERROR, "Invalid image size"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Invalid image size")); return nullptr; } uint16 samplesPerPixel = 0; if (!TIFFGetField(m_hTIFF, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel)) { - pj_log(m_ctx, PJ_LOG_ERROR, "Missing SamplesPerPixel tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Missing SamplesPerPixel tag")); return nullptr; } if (samplesPerPixel == 0) { - pj_log(m_ctx, PJ_LOG_ERROR, "Invalid SamplesPerPixel value"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Invalid SamplesPerPixel value")); return nullptr; } uint16 bitsPerSample = 0; if (!TIFFGetField(m_hTIFF, TIFFTAG_BITSPERSAMPLE, &bitsPerSample)) { - pj_log(m_ctx, PJ_LOG_ERROR, "Missing BitsPerSample tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Missing BitsPerSample tag")); return nullptr; } uint16 planarConfig = 0; if (!TIFFGetField(m_hTIFF, TIFFTAG_PLANARCONFIG, &planarConfig)) { - pj_log(m_ctx, PJ_LOG_ERROR, "Missing PlanarConfig tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Missing PlanarConfig tag")); return nullptr; } uint16 sampleFormat = 0; if (!TIFFGetField(m_hTIFF, TIFFTAG_SAMPLEFORMAT, &sampleFormat)) { - pj_log(m_ctx, PJ_LOG_ERROR, "Missing SampleFormat tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Missing SampleFormat tag")); return nullptr; } @@ -893,9 +897,8 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { else if (sampleFormat == SAMPLEFORMAT_IEEEFP && bitsPerSample == 64) dt = TIFFDataType::Float64; else { - pj_log( - m_ctx, PJ_LOG_ERROR, - "Unsupported combination of SampleFormat and BitsPerSample values"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Unsupported combination of SampleFormat " + "and BitsPerSample values")); return nullptr; } @@ -903,7 +906,7 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { if (!TIFFGetField(m_hTIFF, TIFFTAG_PHOTOMETRIC, &photometric)) photometric = PHOTOMETRIC_MINISBLACK; if (photometric != PHOTOMETRIC_MINISBLACK) { - pj_log(m_ctx, PJ_LOG_ERROR, "Unsupported Photometric value"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Unsupported Photometric value")); return nullptr; } @@ -914,19 +917,19 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { if (compression != COMPRESSION_NONE && !TIFFIsCODECConfigured(compression)) { pj_log(m_ctx, PJ_LOG_ERROR, - "Cannot open TIFF file due to missing codec."); + _("Cannot open TIFF file due to missing codec.")); return nullptr; } // We really don't want to try dealing with old-JPEG images if (compression == COMPRESSION_OJPEG) { - pj_log(m_ctx, PJ_LOG_ERROR, "Unsupported compression method."); + pj_log(m_ctx, PJ_LOG_ERROR, _("Unsupported compression method.")); return nullptr; } const auto blockSize = TIFFIsTiled(m_hTIFF) ? TIFFTileSize64(m_hTIFF) : TIFFStripSize64(m_hTIFF); if (blockSize == 0 || blockSize > 64 * 1024 * 2014) { - pj_log(m_ctx, PJ_LOG_ERROR, "Unsupported block size."); + pj_log(m_ctx, PJ_LOG_ERROR, _("Unsupported block size.")); return nullptr; } @@ -942,12 +945,12 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { } else { if (count < 4 || (count % 4) != 0) { pj_log(m_ctx, PJ_LOG_ERROR, - "Wrong number of values in GeoKeys tag"); + _("Wrong number of values in GeoKeys tag")); return nullptr; } if (geokeys[0] != 1) { - pj_log(m_ctx, PJ_LOG_ERROR, "Unsupported GeoTIFF major version"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Unsupported GeoTIFF major version")); return nullptr; } // We only know that we support GeoTIFF 1.0 and 1.1 at that time @@ -971,9 +974,9 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { extent.isGeographic = false; } else if (geokeys[i + 3] != ModelTypeGeographic) { pj_log(m_ctx, PJ_LOG_ERROR, - "Only GTModelTypeGeoKey = " - "ModelTypeGeographic or ModelTypeProjected are " - "supported"); + _("Only GTModelTypeGeoKey = " + "ModelTypeGeographic or ModelTypeProjected are " + "supported")); return nullptr; } } else if (geokeys[i] == GTRasterTypeGeoKey) { @@ -996,8 +999,8 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { // a GeoTransformationMatrix, since negative values in GeoPixelScale // have historically been implementation bugs. if (matrix[1] != 0 || matrix[4] != 0) { - pj_log(m_ctx, PJ_LOG_ERROR, "Rotational terms not supported in " - "GeoTransformationMatrix tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("Rotational terms not supported in " + "GeoTransformationMatrix tag")); return nullptr; } @@ -1009,12 +1012,12 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { double *geopixelscale = nullptr; if (TIFFGetField(m_hTIFF, TIFFTAG_GEOPIXELSCALE, &count, &geopixelscale) != 1) { - pj_log(m_ctx, PJ_LOG_ERROR, "No GeoPixelScale tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("No GeoPixelScale tag")); return nullptr; } if (count != 3) { pj_log(m_ctx, PJ_LOG_ERROR, - "Wrong number of values in GeoPixelScale tag"); + _("Wrong number of values in GeoPixelScale tag")); return nullptr; } hRes = geopixelscale[0]; @@ -1023,12 +1026,12 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { double *geotiepoints = nullptr; if (TIFFGetField(m_hTIFF, TIFFTAG_GEOTIEPOINTS, &count, &geotiepoints) != 1) { - pj_log(m_ctx, PJ_LOG_ERROR, "No GeoTiePoints tag"); + pj_log(m_ctx, PJ_LOG_ERROR, _("No GeoTiePoints tag")); return nullptr; } if (count != 6) { pj_log(m_ctx, PJ_LOG_ERROR, - "Wrong number of values in GeoTiePoints tag"); + _("Wrong number of values in GeoTiePoints tag")); return nullptr; } @@ -1059,7 +1062,7 @@ std::unique_ptr<GTiffGrid> GTiffDataset::nextGrid() { fabs(extent.south) <= M_PI + 1e-5)) && extent.west < extent.east && extent.south < extent.north && extent.resX > 1e-10 && extent.resY > 1e-10)) { - pj_log(m_ctx, PJ_LOG_ERROR, "Inconsistent georeferencing for %s", + pj_log(m_ctx, PJ_LOG_ERROR, _("Inconsistent georeferencing for %s"), m_filename.c_str()); return nullptr; } @@ -1279,7 +1282,7 @@ GTiffVGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, const auto subfileType = grid->subfileType(); if (subfileType != 0 && subfileType != FILETYPE_PAGE) { if (ifd == 0) { - pj_log(ctx, PJ_LOG_ERROR, "Invalid subfileType"); + pj_log(ctx, PJ_LOG_ERROR, _("Invalid subfileType")); return nullptr; } else { pj_log(ctx, PJ_LOG_DEBUG_MAJOR, @@ -1325,7 +1328,7 @@ GTiffVGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, } if (idxSample >= grid->samplesPerPixel()) { - pj_log(ctx, PJ_LOG_ERROR, "Invalid sample index"); + pj_log(ctx, PJ_LOG_ERROR, _("Invalid sample index")); return nullptr; } @@ -1389,16 +1392,17 @@ VerticalShiftGridSet::open(PJ_CONTEXT *ctx, const std::string &filename) { auto set = std::unique_ptr<VerticalShiftGridSet>( GTiffVGridShiftSet::open(ctx, std::move(fp), actualName)); if (!set) - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return set; #else pj_log(ctx, PJ_LOG_ERROR, - "TIFF grid, but TIFF support disabled in this build"); + _("TIFF grid, but TIFF support disabled in this build")); return nullptr; #endif } - pj_log(ctx, PJ_LOG_DEBUG_MAJOR, "Unrecognized vertical grid format"); + pj_log(ctx, PJ_LOG_ERROR, _("Unrecognized vertical grid format")); return nullptr; } @@ -1570,7 +1574,8 @@ NTv1Grid *NTv1Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, /* Read the header. */ /* -------------------------------------------------------------------- */ if (fp->read(header, sizeof(header)) != sizeof(header)) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -1589,8 +1594,9 @@ NTv1Grid *NTv1Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, if (*((int *)(header + 8)) != 12) { pj_log(ctx, PJ_LOG_ERROR, - "NTv1 grid shift file has wrong record count, corrupt?"); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + _("NTv1 grid shift file has wrong record count, corrupt?")); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -1607,9 +1613,10 @@ NTv1Grid *NTv1Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, fabs(extent.south) <= M_PI + 1e-5 && extent.west < extent.east && extent.south < extent.north && extent.resX > 1e-10 && extent.resY > 1e-10)) { - pj_log(ctx, PJ_LOG_ERROR, "Inconsistent georeferencing for %s", + pj_log(ctx, PJ_LOG_ERROR, _("Inconsistent georeferencing for %s"), filename.c_str()); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } const int columns = static_cast<int>( @@ -1631,7 +1638,8 @@ bool NTv1Grid::valueAt(int x, int y, bool compensateNTConvention, m_fp->seek(192 + 2 * sizeof(double) * (y * m_width + m_width - 1 - x)); if (m_fp->read(&two_doubles[0], sizeof(two_doubles)) != sizeof(two_doubles)) { - proj_context_errno_set(m_ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(m_ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return false; } if (IS_LSB) { @@ -1692,7 +1700,8 @@ CTable2Grid *CTable2Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, /* Read the header. */ /* -------------------------------------------------------------------- */ if (fp->read(header, sizeof(header)) != sizeof(header)) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -1716,9 +1725,10 @@ CTable2Grid *CTable2Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, memcpy(&extent.resY, header + 120, 8); if (!(fabs(extent.west) <= 4 * M_PI && fabs(extent.south) <= M_PI + 1e-5 && extent.resX > 1e-10 && extent.resY > 1e-10)) { - pj_log(ctx, PJ_LOG_ERROR, "Inconsistent georeferencing for %s", + pj_log(ctx, PJ_LOG_ERROR, _("Inconsistent georeferencing for %s"), filename.c_str()); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } int width; @@ -1726,7 +1736,8 @@ CTable2Grid *CTable2Grid::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, memcpy(&width, header + 128, 4); memcpy(&height, header + 132, 4); if (width <= 0 || height <= 0) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } extent.east = extent.west + (width - 1) * extent.resX; @@ -1744,7 +1755,8 @@ bool CTable2Grid::valueAt(int x, int y, bool compensateNTConvention, float two_floats[2]; m_fp->seek(160 + 2 * sizeof(float) * (y * m_width + x)); if (m_fp->read(&two_floats[0], sizeof(two_floats)) != sizeof(two_floats)) { - proj_context_errno_set(m_ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(m_ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return false; } if (!IS_LSB) { @@ -1828,7 +1840,8 @@ bool NTv2Grid::valueAt(int x, int y, bool compensateNTConvention, 4 * sizeof(float) * (static_cast<unsigned long long>(y) * m_width + m_width - 1 - x)); if (m_fp->read(&two_float[0], sizeof(two_float)) != sizeof(two_float)) { - proj_context_errno_set(m_ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(m_ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return false; } if (m_mustSwap) { @@ -1862,14 +1875,16 @@ std::unique_ptr<NTv2GridSet> NTv2GridSet::open(PJ_CONTEXT *ctx, /* Read the header. */ /* -------------------------------------------------------------------- */ if (fpRaw->read(header, sizeof(header)) != sizeof(header)) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } constexpr int OFFSET_GS_TYPE = 56; if (memcmp(header + OFFSET_GS_TYPE, "SECONDS", 7) != 0) { - pj_log(ctx, PJ_LOG_ERROR, "Only GS_TYPE=SECONDS is supported"); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + pj_log(ctx, PJ_LOG_ERROR, _("Only GS_TYPE=SECONDS is supported")); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -1899,12 +1914,14 @@ std::unique_ptr<NTv2GridSet> NTv2GridSet::open(PJ_CONTEXT *ctx, for (unsigned subfile = 0; subfile < num_subfiles; subfile++) { // Read header if (fpRaw->read(header, sizeof(header)) != sizeof(header)) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } if (strncmp(header, "SUB_NAME", 8) != 0) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -1944,9 +1961,10 @@ std::unique_ptr<NTv2GridSet> NTv2GridSet::open(PJ_CONTEXT *ctx, fabs(extent.south) <= M_PI + 1e-5 && extent.west < extent.east && extent.south < extent.north && extent.resX > 1e-10 && extent.resY > 1e-10)) { - pj_log(ctx, PJ_LOG_ERROR, "Inconsistent georeferencing for %s", + pj_log(ctx, PJ_LOG_ERROR, _("Inconsistent georeferencing for %s"), filename.c_str()); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } const int columns = static_cast<int>( @@ -1964,9 +1982,10 @@ std::unique_ptr<NTv2GridSet> NTv2GridSet::open(PJ_CONTEXT *ctx, memcpy(&gs_count, header + OFFSET_GS_COUNT, 4); if (gs_count / columns != static_cast<unsigned>(rows)) { pj_log(ctx, PJ_LOG_ERROR, - "GS_COUNT(%u) does not match expected cells (%dx%d)", + _("GS_COUNT(%u) does not match expected cells (%dx%d)"), gs_count, columns, rows); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return nullptr; } @@ -2161,11 +2180,11 @@ GTiffHGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, const auto subfileType = grid->subfileType(); if (subfileType != 0 && subfileType != FILETYPE_PAGE) { if (ifd == 0) { - pj_log(ctx, PJ_LOG_ERROR, "Invalid subfileType"); + pj_log(ctx, PJ_LOG_ERROR, _("Invalid subfileType")); return nullptr; } else { pj_log(ctx, PJ_LOG_DEBUG_MAJOR, - "Ignoring IFD %d as it has a unsupported subfileType", + _("Ignoring IFD %d as it has a unsupported subfileType"), ifd); continue; } @@ -2174,11 +2193,12 @@ GTiffHGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, if (grid->samplesPerPixel() < 2) { if (ifd == 0) { pj_log(ctx, PJ_LOG_ERROR, - "At least 2 samples per pixel needed"); + _("At least 2 samples per pixel needed")); return nullptr; } else { pj_log(ctx, PJ_LOG_DEBUG_MAJOR, - "Ignoring IFD %d as it has not at least 2 samples", ifd); + _("Ignoring IFD %d as it has not at least 2 samples"), + ifd); continue; } } @@ -2223,19 +2243,21 @@ GTiffHGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, } } if (foundDescriptionForLatOffset && !foundDescriptionForLonOffset) { - pj_log(ctx, PJ_LOG_ERROR, - "Found latitude_offset channel, but not longitude_offset"); + pj_log( + ctx, PJ_LOG_ERROR, + _("Found latitude_offset channel, but not longitude_offset")); return nullptr; } else if (foundDescriptionForLonOffset && !foundDescriptionForLatOffset) { - pj_log(ctx, PJ_LOG_ERROR, - "Found longitude_offset channel, but not latitude_offset"); + pj_log( + ctx, PJ_LOG_ERROR, + _("Found longitude_offset channel, but not latitude_offset")); return nullptr; } if (idxLatShift >= grid->samplesPerPixel() || idxLonShift >= grid->samplesPerPixel()) { - pj_log(ctx, PJ_LOG_ERROR, "Invalid sample index"); + pj_log(ctx, PJ_LOG_ERROR, _("Invalid sample index")); return nullptr; } @@ -2249,7 +2271,7 @@ GTiffHGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, positiveEast = true; } else { pj_log(ctx, PJ_LOG_ERROR, - "Unsupported value %s for 'positive_value'", + _("Unsupported value %s for 'positive_value'"), positiveValue.c_str()); return nullptr; } @@ -2264,7 +2286,7 @@ GTiffHGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, grid->metadataItem("UNITTYPE", idxLonShift); if (unitLatShift != unitLonShift) { pj_log(ctx, PJ_LOG_ERROR, - "Different unit for longitude and latitude offset"); + _("Different unit for longitude and latitude offset")); return nullptr; } if (!unitLatShift.empty()) { @@ -2275,7 +2297,7 @@ GTiffHGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, } else if (unitLatShift == "degree") { convFactorToRadian = M_PI / 180.0; } else { - pj_log(ctx, PJ_LOG_ERROR, "Unsupported unit %s", + pj_log(ctx, PJ_LOG_ERROR, _("Unsupported unit %s"), unitLatShift.c_str()); return nullptr; } @@ -2367,16 +2389,17 @@ HorizontalShiftGridSet::open(PJ_CONTEXT *ctx, const std::string &filename) { auto set = std::unique_ptr<HorizontalShiftGridSet>( GTiffHGridShiftSet::open(ctx, std::move(fp), actualName)); if (!set) - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return set; #else pj_log(ctx, PJ_LOG_ERROR, - "TIFF grid, but TIFF support disabled in this build"); + _("TIFF grid, but TIFF support disabled in this build")); return nullptr; #endif } - pj_log(ctx, PJ_LOG_DEBUG_MAJOR, "Unrecognized horizontal grid format"); + pj_log(ctx, PJ_LOG_ERROR, _("Unrecognized horizontal grid format")); return nullptr; } @@ -2628,11 +2651,11 @@ GTiffGenericGridShiftSet::open(PJ_CONTEXT *ctx, std::unique_ptr<File> fp, const auto subfileType = grid->subfileType(); if (subfileType != 0 && subfileType != FILETYPE_PAGE) { if (ifd == 0) { - pj_log(ctx, PJ_LOG_ERROR, "Invalid subfileType"); + pj_log(ctx, PJ_LOG_ERROR, _("Invalid subfileType")); return nullptr; } else { pj_log(ctx, PJ_LOG_DEBUG_MAJOR, - "Ignoring IFD %d as it has a unsupported subfileType", + _("Ignoring IFD %d as it has a unsupported subfileType"), ifd); continue; } @@ -2703,16 +2726,17 @@ GenericShiftGridSet::open(PJ_CONTEXT *ctx, const std::string &filename) { auto set = std::unique_ptr<GenericShiftGridSet>( GTiffGenericGridShiftSet::open(ctx, std::move(fp), actualName)); if (!set) - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return set; #else pj_log(ctx, PJ_LOG_ERROR, - "TIFF grid, but TIFF support disabled in this build"); + _("TIFF grid, but TIFF support disabled in this build")); return nullptr; #endif } - pj_log(ctx, PJ_LOG_DEBUG_MAJOR, "Unrecognized generic grid format"); + pj_log(ctx, PJ_LOG_ERROR, _("Unrecognized generic grid format")); return nullptr; } @@ -2785,8 +2809,9 @@ ListOfGenericGrids pj_generic_grid_init(PJ *P, const char *gridkey) { auto gridSet = GenericShiftGridSet::open(P->ctx, gridname); if (!gridSet) { if (!canFail) { - if (proj_context_errno(P->ctx) != PJD_ERR_NETWORK_ERROR) { - proj_context_errno_set(P->ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + if (proj_context_errno(P->ctx) != PROJ_ERR_OTHER_NETWORK_ERROR) { + proj_context_errno_set( + P->ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } return {}; } @@ -2830,8 +2855,9 @@ static ListOfHGrids getListOfGridSets(PJ_CONTEXT *ctx, const char *grids) { auto gridSet = HorizontalShiftGridSet::open(ctx, gridname); if (!gridSet) { if (!canFail) { - if (proj_context_errno(ctx) != PJD_ERR_NETWORK_ERROR) { - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + if (proj_context_errno(ctx) != PROJ_ERR_OTHER_NETWORK_ERROR) { + proj_context_errno_set( + ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } return {}; } @@ -3067,7 +3093,7 @@ PJ_LP pj_hgrid_apply(PJ_CONTEXT *ctx, const ListOfHGrids &grids, PJ_LP lp, HorizontalShiftGridSet *gridset = nullptr; const auto grid = findGrid(grids, lp, gridset); if (!grid) { - proj_context_errno_set(ctx, PJD_ERR_GRID_AREA); + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID); return out; } if (grid->isNullGrid()) { @@ -3083,7 +3109,7 @@ PJ_LP pj_hgrid_apply(PJ_CONTEXT *ctx, const ListOfHGrids &grids, PJ_LP lp, } if (out.lam == HUGE_VAL || out.phi == HUGE_VAL) - proj_context_errno_set(ctx, PJD_ERR_GRID_AREA); + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID); return out; } @@ -3099,7 +3125,7 @@ PJ_LP pj_hgrid_value(PJ *P, const ListOfHGrids &grids, PJ_LP lp) { HorizontalShiftGridSet *gridset = nullptr; const auto grid = findGrid(grids, lp, gridset); if (!grid) { - proj_context_errno_set(P->ctx, PJD_ERR_GRID_AREA); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID); return out; } @@ -3107,8 +3133,9 @@ PJ_LP pj_hgrid_value(PJ *P, const ListOfHGrids &grids, PJ_LP lp) { const auto &extent = grid->extentAndRes(); if (!extent.isGeographic) { pj_log(P->ctx, PJ_LOG_ERROR, - "Can only handle grids referenced in a geographic CRS"); - proj_context_errno_set(P->ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + _("Can only handle grids referenced in a geographic CRS")); + proj_context_errno_set(P->ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return out; } @@ -3131,7 +3158,7 @@ PJ_LP pj_hgrid_value(PJ *P, const ListOfHGrids &grids, PJ_LP lp) { } if (out.lam == HUGE_VAL || out.phi == HUGE_VAL) { - proj_context_errno_set(P->ctx, PJD_ERR_GRID_AREA); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID); } return out; @@ -3158,7 +3185,7 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, } } if (!grid) { - proj_context_errno_set(ctx, PJD_ERR_GRID_AREA); + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID); return HUGE_VAL; } if (grid->isNullGrid()) { @@ -3168,8 +3195,9 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, const auto &extent = grid->extentAndRes(); if (!extent.isGeographic) { pj_log(ctx, PJ_LOG_ERROR, - "Can only handle grids referenced in a geographic CRS"); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + _("Can only handle grids referenced in a geographic CRS")); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return HUGE_VAL; } @@ -3200,8 +3228,8 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, int grid_ix = static_cast<int>(lround(floor(grid_x))); if (!(grid_ix >= 0 && grid_ix < grid->width())) { // in the unlikely case we end up here... - pj_log(ctx, PJ_LOG_ERROR, "grid_ix not in grid"); - proj_context_errno_set(ctx, PJD_ERR_GRID_AREA); + pj_log(ctx, PJ_LOG_ERROR, _("grid_ix not in grid")); + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID); return HUGE_VAL; } int grid_iy = static_cast<int>(lround(floor(grid_y))); @@ -3268,9 +3296,10 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, total_weight += weight; n_weights++; } - if (n_weights == 0) + if (n_weights == 0) { + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA); value = HUGE_VAL; - else if (n_weights != 4) + } else if (n_weights != 4) value /= total_weight; return value * vmultiplier; @@ -3309,8 +3338,9 @@ ListOfVGrids pj_vgrid_init(PJ *P, const char *gridkey) { auto gridSet = VerticalShiftGridSet::open(P->ctx, gridname); if (!gridSet) { if (!canFail) { - if (proj_context_errno(P->ctx) != PJD_ERR_NETWORK_ERROR) { - proj_context_errno_set(P->ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + if (proj_context_errno(P->ctx) != PROJ_ERR_OTHER_NETWORK_ERROR) { + proj_context_errno_set( + P->ctx, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } return {}; } @@ -3379,7 +3409,8 @@ bool pj_bilinear_interpolation_three_samples( if (!extent.isGeographic) { pj_log(ctx, PJ_LOG_ERROR, "Can only handle grids referenced in a geographic CRS"); - proj_context_errno_set(ctx, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_context_errno_set(ctx, + PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); return false; } diff --git a/src/init.cpp b/src/init.cpp index 1e89402d..461b44ba 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -30,7 +30,6 @@ #define PJ_LIB__ #include <ctype.h> -#include <errno.h> #include <math.h> #include <stddef.h> #include <stdio.h> @@ -55,7 +54,7 @@ static paralist *string_to_paralist (PJ_CONTEXT *ctx, char *definition) { /* Keep a handle to the start of the list, so we have something to return */ auto param = pj_mkparam_ws (c, &c); if (nullptr==param) { - free_params (ctx, first, ENOMEM); + free_params (ctx, first, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } if (nullptr==last) { @@ -104,7 +103,8 @@ static char *get_init_string (PJ_CONTEXT *ctx, const char *name) { /* Locate the name of the section we search for */ section = strrchr(fname, ':'); if (nullptr==section) { - proj_context_errno_set (ctx, PJD_ERR_NO_COLON_IN_INIT_STRING); + pj_log(ctx, PJ_LOG_ERROR, _("Missing colon in +init")); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); free (fname); return nullptr; } @@ -117,8 +117,9 @@ static char *get_init_string (PJ_CONTEXT *ctx, const char *name) { auto file = NS_PROJ::FileManager::open_resource_file(ctx, fname); if (nullptr==file) { + pj_log(ctx, PJ_LOG_ERROR, _("Cannot open %s"), fname); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); free (fname); - proj_context_errno_set (ctx, PJD_ERR_NO_OPTION_IN_INIT_FILE); return nullptr; } @@ -131,8 +132,9 @@ static char *get_init_string (PJ_CONTEXT *ctx, const char *name) { line = file->read_line(MAX_LINE_LENGTH, maxLenReached, eofReached); /* End of file? */ if (maxLenReached || eofReached) { + pj_log(ctx, PJ_LOG_ERROR, _("Invalid content for %s"), fname); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); free (fname); - proj_context_errno_set (ctx, PJD_ERR_NO_OPTION_IN_INIT_FILE); return nullptr; } @@ -441,7 +443,8 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all ctx->last_errno = 0; if (argc <= 0) { - proj_context_errno_set (ctx, PJD_ERR_NO_ARGS); + pj_log(ctx, PJ_LOG_ERROR, _("No arguments")); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_MISSING_ARG); return nullptr; } @@ -455,13 +458,15 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* can't have nested pipelines directly */ if (n_pipelines > 1) { - proj_context_errno_set (ctx, PJD_ERR_MALFORMED_PIPELINE); + pj_log(ctx, PJ_LOG_ERROR, _("Nested pipelines are not supported")); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); return nullptr; } /* don't allow more than one +init in non-pipeline operations */ if (n_pipelines == 0 && n_inits > 1) { - proj_context_errno_set (ctx, PJD_ERR_TOO_MANY_INITS); + pj_log(ctx, PJ_LOG_ERROR, _("Too many inits")); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); return nullptr; } @@ -469,14 +474,14 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* put arguments into internal linked list */ start = curr = pj_mkparam(argv[0]); if (!curr) { - free_params (ctx, start, ENOMEM); + free_params (ctx, start, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } for (i = 1; i < argc; ++i) { curr->next = pj_mkparam(argv[i]); if (!curr->next) { - free_params (ctx, start, ENOMEM); + free_params (ctx, start, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } curr = curr->next; @@ -491,7 +496,7 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all if (init && n_pipelines == 0) { init = pj_expand_init_internal (ctx, init, allow_init_epsg); if (!init) { - free_params (ctx, start, PJD_ERR_NO_ARGS); + free_params (ctx, start, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); return nullptr; } } @@ -503,19 +508,22 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* Find projection selection */ curr = pj_param_exists (start, "proj"); if (nullptr==curr) { - free_params (ctx, start, PJD_ERR_PROJ_NOT_NAMED); + pj_log(ctx, PJ_LOG_ERROR, _("Missing proj")); + free_params (ctx, start, PROJ_ERR_INVALID_OP_MISSING_ARG); return nullptr; } name = curr->param; if (strlen (name) < 6) { - free_params (ctx, start, PJD_ERR_PROJ_NOT_NAMED); + pj_log(ctx, PJ_LOG_ERROR, _("Invalid value for proj")); + free_params (ctx, start, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); return nullptr; } name += 5; proj = locate_constructor (name); if (nullptr==proj) { - free_params (ctx, start, PJD_ERR_UNKNOWN_PROJECTION_ID); + pj_log(ctx, PJ_LOG_ERROR, _("Unknown projection")); + free_params (ctx, start, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); return nullptr; } @@ -524,7 +532,7 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* Allocate projection structure */ PIN = proj(nullptr); if (nullptr==PIN) { - free_params (ctx, start, ENOMEM); + free_params (ctx, start, PROJ_ERR_INVALID_OP /*ENOMEM*/); return nullptr; } @@ -550,11 +558,11 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all if (err) { /* Didn't get an ellps, but doesn't need one: Get a free WGS84 */ if (PIN->need_ellps) { - pj_log (ctx, PJ_LOG_DEBUG_MINOR, "pj_init_ctx: Must specify ellipsoid or sphere"); + pj_log (ctx, PJ_LOG_ERROR, _("pj_init_ctx: Must specify ellipsoid or sphere")); return pj_default_destructor (PIN, proj_errno(PIN)); } else { - if (PJD_ERR_MAJOR_AXIS_NOT_GIVEN==proj_errno (PIN)) + if (PIN->a == 0) proj_errno_reset (PIN); PIN->f = 1.0/298.257223563; PIN->a = 6378137.0; @@ -564,7 +572,7 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all PIN->a_orig = PIN->a; PIN->es_orig = PIN->es; if (pj_calc_ellipsoid_params (PIN, PIN->a, PIN->es)) - return pj_default_destructor (PIN, PJD_ERR_INVALID_ECCENTRICITY); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); /* Now that we have ellipse information check for WGS84 datum */ if( PIN->datum_type == PJD_3PARAM @@ -596,7 +604,10 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* when correcting longitudes around it */ /* The test is written this way to error on long_wrap_center "=" NaN */ if( !(fabs(PIN->long_wrap_center) < 10 * M_TWOPI) ) - return pj_default_destructor (PIN, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT); + { + proj_log_error(PIN, _("Invalid value for lon_wrap")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } /* Axis orientation */ @@ -605,12 +616,18 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all const char *axis_legal = "ewnsud"; const char *axis_arg = pj_param(ctx, start,"saxis").s; if( strlen(axis_arg) != 3 ) - return pj_default_destructor (PIN, PJD_ERR_AXIS); + { + proj_log_error(PIN, _("Invalid value for axis")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if( strchr( axis_legal, axis_arg[0] ) == nullptr || strchr( axis_legal, axis_arg[1] ) == nullptr || strchr( axis_legal, axis_arg[2] ) == nullptr) - return pj_default_destructor (PIN, PJD_ERR_AXIS); + { + proj_log_error(PIN, _("Invalid value for axis")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } /* TODO: it would be nice to validate we don't have on axis repeated */ strcpy( PIN->axis, axis_arg ); @@ -622,7 +639,10 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* Central latitude */ PIN->phi0 = pj_param(ctx, start, "rlat_0").f; if( fabs(PIN->phi0) > M_HALFPI ) - return pj_default_destructor (PIN, PJD_ERR_LAT_LARGER_THAN_90); + { + proj_log_error(PIN, _("Invalid value for lat_0: |lat_0| should be <= 90°")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } /* False easting and northing */ PIN->x0 = pj_param(ctx, start, "dx_0").f; @@ -638,7 +658,10 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all else PIN->k0 = 1.; if (PIN->k0 <= 0.) - return pj_default_destructor (PIN, PJD_ERR_K_LESS_THAN_ZERO); + { + proj_log_error(PIN, _("Invalid value for k/k_0: it should be > 0")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } /* Set units */ units = pj_list_linear_units(); @@ -646,7 +669,10 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all if ((name = pj_param(ctx, start, "sunits").s) != nullptr) { for (i = 0; (s = units[i].id) && strcmp(name, s) ; ++i) ; if (!s) - return pj_default_destructor (PIN, PJD_ERR_UNKNOWN_UNIT_ID); + { + proj_log_error(PIN, _("Invalid value for units")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } s = units[i].to_meter; } if (s || (s = pj_param(ctx, start, "sto_meter").s)) { @@ -657,11 +683,17 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all ++s; double denom = pj_strtod(s, nullptr); if (denom == 0.0) - return pj_default_destructor (PIN, PJD_ERR_UNIT_FACTOR_LESS_THAN_0); + { + proj_log_error(PIN, _("Invalid value for to_meter donominator")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } PIN->to_meter /= denom; } if (PIN->to_meter <= 0.0) - return pj_default_destructor (PIN, PJD_ERR_UNIT_FACTOR_LESS_THAN_0); + { + proj_log_error(PIN, _("Invalid value for to_meter")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } PIN->fr_meter = 1 / PIN->to_meter; } else @@ -672,7 +704,10 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all if ((name = pj_param(ctx, start, "svunits").s) != nullptr) { for (i = 0; (s = units[i].id) && strcmp(name, s) ; ++i) ; if (!s) - return pj_default_destructor (PIN, PJD_ERR_UNKNOWN_UNIT_ID); + { + proj_log_error(PIN, _("Invalid value for vunits")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } s = units[i].to_meter; } if (s || (s = pj_param(ctx, start, "svto_meter").s)) { @@ -683,11 +718,17 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all ++s; double denom = pj_strtod(s, nullptr); if (denom == 0.0) - return pj_default_destructor (PIN, PJD_ERR_UNIT_FACTOR_LESS_THAN_0); + { + proj_log_error(PIN, _("Invalid value for vto_meter donominator")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } PIN->vto_meter /= denom; } if (PIN->vto_meter <= 0.0) - return pj_default_destructor (PIN, PJD_ERR_UNIT_FACTOR_LESS_THAN_0); + { + proj_log_error(PIN, _("Invalid value for vto_meter")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } PIN->vfr_meter = 1. / PIN->vto_meter; } else { PIN->vto_meter = PIN->to_meter; @@ -716,7 +757,10 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all value = name; if (!value) - return pj_default_destructor (PIN, PJD_ERR_UNKNOWN_PRIME_MERIDIAN); + { + proj_log_error(PIN, _("Invalid value for pm")); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } PIN->from_greenwich = dmstor_ctx(ctx,value,nullptr); } else @@ -725,7 +769,7 @@ pj_init_ctx_with_allow_init_epsg(PJ_CONTEXT *ctx, int argc, char **argv, int all /* Private object for the geodesic functions */ PIN->geod = static_cast<struct geod_geodesic*>(calloc (1, sizeof (struct geod_geodesic))); if (nullptr==PIN->geod) - return pj_default_destructor (PIN, ENOMEM); + return pj_default_destructor (PIN, PROJ_ERR_INVALID_OP /*ENOMEM*/); geod_init(PIN->geod, PIN->a, (1 - sqrt (1 - PIN->es))); /* Projection specific initialization */ diff --git a/src/internal.cpp b/src/internal.cpp index 9cc48120..b96e2160 100644 --- a/src/internal.cpp +++ b/src/internal.cpp @@ -89,12 +89,9 @@ chained calls starting out with a call to its 2D interface. coo.lp = pj_inv (coo.xy, P); return coo; case PJ_IDENT: - return coo; - default: break; } - proj_errno_set (P, EINVAL); - return proj_coord_error (); + return coo; } @@ -119,12 +116,9 @@ chained calls starting out with a call to its 3D interface. coo.lpz = pj_inv3d (coo.xyz, P); return coo; case PJ_IDENT: - return coo; - default: break; } - proj_errno_set (P, EINVAL); - return proj_coord_error (); + return coo; } /**************************************************************************************/ diff --git a/src/inv.cpp b/src/inv.cpp index 626c9ee5..b4a42189 100644 --- a/src/inv.cpp +++ b/src/inv.cpp @@ -38,7 +38,7 @@ static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { if (coo.v[0] == HUGE_VAL || coo.v[1] == HUGE_VAL || coo.v[2] == HUGE_VAL) { - proj_errno_set (P, PJD_ERR_INVALID_X_OR_Y); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error (); } @@ -97,7 +97,7 @@ static PJ_COORD inv_prepare (PJ *P, PJ_COORD coo) { static PJ_COORD inv_finalize (PJ *P, PJ_COORD coo) { if (coo.xyz.x == HUGE_VAL) { - proj_errno_set (P, PJD_ERR_INVALID_X_OR_Y); + proj_errno_set (P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error (); } @@ -163,7 +163,7 @@ PJ_LP pj_inv(PJ_XY xy, PJ *P) { else if (P->inv4d) coo = P->inv4d (coo, P); else { - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_OTHER_NO_INVERSE_OP); return proj_coord_error ().lp; } if (HUGE_VAL==coo.v[0]) @@ -197,7 +197,7 @@ PJ_LPZ pj_inv3d (PJ_XYZ xyz, PJ *P) { else if (P->inv) coo.lp = P->inv (coo.xy, P); else { - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_OTHER_NO_INVERSE_OP); return proj_coord_error ().lpz; } if (HUGE_VAL==coo.v[0]) @@ -227,7 +227,7 @@ PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P) { else if (P->inv) coo.lp = P->inv (coo.xy, P); else { - proj_errno_set (P, EINVAL); + proj_errno_set (P, PROJ_ERR_OTHER_NO_INVERSE_OP); return proj_coord_error (); } if (HUGE_VAL==coo.v[0]) diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index 6bc1f166..cb0c113a 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -82,7 +82,7 @@ static void PROJ_NO_INLINE proj_log_error(PJ_CONTEXT *ctx, const char *function, auto previous_errno = proj_context_errno(ctx); if (previous_errno == 0) { // only set errno if it wasn't set deeper down the call stack - proj_context_errno_set(ctx, PJD_ERR_GENERIC_ERROR); + proj_context_errno_set(ctx, PROJ_ERR_OTHER); } } @@ -344,6 +344,7 @@ const char *proj_context_get_database_metadata(PJ_CONTEXT *ctx, const char *key) { SANITIZE_CTX(ctx); if (!key) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -375,6 +376,7 @@ PJ_GUESSED_WKT_DIALECT proj_context_guess_wkt_dialect(PJ_CONTEXT *ctx, const char *wkt) { (void)ctx; if (!wkt) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return PJ_GUESSED_NOT_WKT; } @@ -423,6 +425,7 @@ static const char *getOptionValue(const char *option, PJ *proj_clone(PJ_CONTEXT *ctx, const PJ *obj) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -458,6 +461,7 @@ PJ *proj_clone(PJ_CONTEXT *ctx, const PJ *obj) { PJ *proj_create(PJ_CONTEXT *ctx, const char *text) { SANITIZE_CTX(ctx); if (!text) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -534,6 +538,7 @@ PJ *proj_create_from_wkt(PJ_CONTEXT *ctx, const char *wkt, PROJ_STRING_LIST *out_grammar_errors) { SANITIZE_CTX(ctx); if (!wkt) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -647,6 +652,7 @@ PJ *proj_create_from_database(PJ_CONTEXT *ctx, const char *auth_name, const char *const *options) { SANITIZE_CTX(ctx); if (!auth_name || !code) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -752,6 +758,7 @@ int proj_uom_get_info_from_database(PJ_CONTEXT *ctx, const char *auth_name, SANITIZE_CTX(ctx); if (!auth_name || !code) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -804,6 +811,7 @@ int PROJ_DLL proj_grid_get_info_from_database( int *out_direct_download, int *out_open_license, int *out_available) { SANITIZE_CTX(ctx); if (!grid_name) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -863,6 +871,7 @@ PJ_OBJ_LIST *proj_query_geodetic_crs_from_datum(PJ_CONTEXT *ctx, const char *crs_type) { SANITIZE_CTX(ctx); if (!datum_auth_name || !datum_code) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1200,6 +1209,7 @@ int proj_is_deprecated(const PJ *obj) { PJ_OBJ_LIST *proj_get_non_deprecated(PJ_CONTEXT *ctx, const PJ *obj) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1230,6 +1240,7 @@ static int proj_is_equivalent_to_internal(PJ_CONTEXT *ctx, const PJ *obj, if (!obj || !other) { if (ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); } return false; @@ -1435,6 +1446,7 @@ const char *proj_as_wkt(PJ_CONTEXT *ctx, const PJ *obj, PJ_WKT_TYPE type, const char *const *options) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1536,6 +1548,7 @@ const char *proj_as_proj_string(PJ_CONTEXT *ctx, const PJ *obj, const char *const *options) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1625,6 +1638,7 @@ const char *proj_as_projjson(PJ_CONTEXT *ctx, const PJ *obj, const char *const *options) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1784,6 +1798,7 @@ int proj_get_area_of_use(PJ_CONTEXT *ctx, const PJ *obj, static const GeodeticCRS *extractGeodeticCRS(PJ_CONTEXT *ctx, const PJ *crs, const char *fname) { if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, fname, "missing required input"); return nullptr; } @@ -1841,6 +1856,7 @@ PJ *proj_crs_get_geodetic_crs(PJ_CONTEXT *ctx, const PJ *crs) { PJ *proj_crs_get_sub_crs(PJ_CONTEXT *ctx, const PJ *crs, int index) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1875,6 +1891,7 @@ PJ *proj_crs_create_bound_crs(PJ_CONTEXT *ctx, const PJ *base_crs, const PJ *hub_crs, const PJ *transformation) { SANITIZE_CTX(ctx); if (!base_crs || !hub_crs || !transformation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1934,6 +1951,7 @@ PJ *proj_crs_create_bound_crs_to_WGS84(PJ_CONTEXT *ctx, const PJ *crs, const char *const *options) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -1996,6 +2014,7 @@ PJ *proj_crs_create_bound_vertical_crs(PJ_CONTEXT *ctx, const PJ *vert_crs, const char *grid_name) { SANITIZE_CTX(ctx); if (!vert_crs || !hub_geographic_3D_crs || !grid_name) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -2122,6 +2141,7 @@ int proj_ellipsoid_get_parameters(PJ_CONTEXT *ctx, const PJ *ellipsoid, double *out_inv_flattening) { SANITIZE_CTX(ctx); if (!ellipsoid) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return FALSE; } @@ -2203,6 +2223,7 @@ int proj_prime_meridian_get_parameters(PJ_CONTEXT *ctx, const char **out_unit_name) { SANITIZE_CTX(ctx); if (!prime_meridian) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -2288,6 +2309,7 @@ PJ *proj_get_source_crs(PJ_CONTEXT *ctx, const PJ *obj) { PJ *proj_get_target_crs(PJ_CONTEXT *ctx, const PJ *obj) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -2372,6 +2394,7 @@ PJ_OBJ_LIST *proj_identify(PJ_CONTEXT *ctx, const PJ *obj, int **out_confidence) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -2468,6 +2491,7 @@ PROJ_STRING_LIST proj_get_codes_from_database(PJ_CONTEXT *ctx, int allow_deprecated) { SANITIZE_CTX(ctx); if (!auth_name) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -2824,6 +2848,7 @@ void proj_unit_list_destroy(PROJ_UNIT_INFO **list) { PJ *proj_crs_get_coordoperation(PJ_CONTEXT *ctx, const PJ *crs) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -2868,6 +2893,7 @@ int proj_coordoperation_get_method_info(PJ_CONTEXT *ctx, const char **out_method_code) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -3416,6 +3442,7 @@ PJ *proj_create_compound_crs(PJ_CONTEXT *ctx, const char *crs_name, SANITIZE_CTX(ctx); if (!horiz_crs || !vert_crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3458,6 +3485,7 @@ PJ *proj_create_compound_crs(PJ_CONTEXT *ctx, const char *crs_name, PJ PROJ_DLL *proj_alter_name(PJ_CONTEXT *ctx, const PJ *obj, const char *name) { SANITIZE_CTX(ctx); if (!obj || !name) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3495,6 +3523,7 @@ PJ PROJ_DLL *proj_alter_id(PJ_CONTEXT *ctx, const PJ *obj, const char *auth_name, const char *code) { SANITIZE_CTX(ctx); if (!obj || !auth_name || !code) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3535,6 +3564,7 @@ PJ *proj_crs_alter_geodetic_crs(PJ_CONTEXT *ctx, const PJ *obj, const PJ *new_geod_crs) { SANITIZE_CTX(ctx); if (!obj || !new_geod_crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3648,6 +3678,7 @@ PJ *proj_crs_alter_cs_linear_unit(PJ_CONTEXT *ctx, const PJ *obj, const char *unit_code) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3700,6 +3731,7 @@ PJ *proj_crs_alter_parameters_linear_unit(PJ_CONTEXT *ctx, const PJ *obj, int convert_to_new_unit) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3745,6 +3777,7 @@ PJ *proj_crs_promote_to_3D(PJ_CONTEXT *ctx, const char *crs_3D_name, const PJ *crs_2D) { SANITIZE_CTX(ctx); if (!crs_2D) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3804,6 +3837,7 @@ PJ *proj_crs_create_projected_3D_crs_from_2D(PJ_CONTEXT *ctx, const PJ *geog_3D_crs) { SANITIZE_CTX(ctx); if (!projected_2D_crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -3889,6 +3923,7 @@ PJ *proj_crs_demote_to_2D(PJ_CONTEXT *ctx, const char *crs_2D_name, const PJ *crs_3D) { SANITIZE_CTX(ctx); if (!crs_3D) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -4097,6 +4132,7 @@ PJ *proj_create_transformation(PJ_CONTEXT *ctx, const char *name, double accuracy) { SANITIZE_CTX(ctx); if (!source_crs || !target_crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -4182,6 +4218,7 @@ PJ *proj_convert_conversion_to_other_method(PJ_CONTEXT *ctx, const char *new_method_name) { SANITIZE_CTX(ctx); if (!conversion) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -4566,6 +4603,7 @@ PJ *proj_create_projected_crs(PJ_CONTEXT *ctx, const char *crs_name, const PJ *coordinate_system) { SANITIZE_CTX(ctx); if (!geodetic_crs || !conversion || !coordinate_system) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -6897,6 +6935,7 @@ int proj_coordoperation_is_instantiable(PJ_CONTEXT *ctx, const PJ *coordoperation) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -6942,6 +6981,7 @@ int proj_coordoperation_has_ballpark_transformation(PJ_CONTEXT *ctx, const PJ *coordoperation) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -6968,6 +7008,7 @@ int proj_coordoperation_get_param_count(PJ_CONTEXT *ctx, const PJ *coordoperation) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -6996,6 +7037,7 @@ int proj_coordoperation_get_param_index(PJ_CONTEXT *ctx, const char *name) { SANITIZE_CTX(ctx); if (!coordoperation || !name) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return -1; } @@ -7057,6 +7099,7 @@ int proj_coordoperation_get_param( const char **out_unit_code, const char **out_unit_category) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -7186,6 +7229,7 @@ int proj_coordoperation_get_towgs84_values(PJ_CONTEXT *ctx, int emit_error_if_incompatible) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -7225,6 +7269,7 @@ int proj_coordoperation_get_grid_used_count(PJ_CONTEXT *ctx, const PJ *coordoperation) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -7418,6 +7463,7 @@ void proj_operation_factory_context_set_desired_accuracy( double accuracy) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7449,6 +7495,7 @@ void proj_operation_factory_context_set_area_of_interest( double north_lat_degree) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7478,6 +7525,7 @@ void proj_operation_factory_context_set_crs_extent_use( PROJ_CRS_EXTENT_USE use) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7527,6 +7575,7 @@ void PROJ_DLL proj_operation_factory_context_set_spatial_criterion( PROJ_SPATIAL_CRITERION criterion) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7564,6 +7613,7 @@ void PROJ_DLL proj_operation_factory_context_set_grid_availability_use( PROJ_GRID_AVAILABILITY_USE use) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7614,6 +7664,7 @@ void proj_operation_factory_context_set_use_proj_alternative_grid_names( int usePROJNames) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7650,6 +7701,7 @@ void proj_operation_factory_context_set_allow_use_intermediate_crs( PROJ_INTERMEDIATE_CRS_USE use) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7691,6 +7743,7 @@ void proj_operation_factory_context_set_allowed_intermediate_crs( const char *const *list_of_auth_name_codes) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7720,6 +7773,7 @@ void PROJ_DLL proj_operation_factory_context_set_discard_superseded( PJ_CONTEXT *ctx, PJ_OPERATION_FACTORY_CONTEXT *factory_ctx, int discard) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7743,6 +7797,7 @@ void PROJ_DLL proj_operation_factory_context_set_allow_ballpark_transformations( PJ_CONTEXT *ctx, PJ_OPERATION_FACTORY_CONTEXT *factory_ctx, int allow) { SANITIZE_CTX(ctx); if (!factory_ctx) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return; } @@ -7840,6 +7895,7 @@ proj_create_operations(PJ_CONTEXT *ctx, const PJ *source_crs, const PJ_OPERATION_FACTORY_CONTEXT *operationContext) { SANITIZE_CTX(ctx); if (!source_crs || !target_crs || !operationContext) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -7951,6 +8007,7 @@ int proj_list_get_count(const PJ_OBJ_LIST *result) { PJ *proj_list_get(PJ_CONTEXT *ctx, const PJ_OBJ_LIST *result, int index) { SANITIZE_CTX(ctx); if (!result) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -7984,6 +8041,7 @@ double proj_coordoperation_get_accuracy(PJ_CONTEXT *ctx, const PJ *coordoperation) { SANITIZE_CTX(ctx); if (!coordoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return -1; } @@ -8024,6 +8082,7 @@ double proj_coordoperation_get_accuracy(PJ_CONTEXT *ctx, PJ *proj_crs_get_datum(PJ_CONTEXT *ctx, const PJ *crs) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -8060,6 +8119,7 @@ PJ *proj_crs_get_datum(PJ_CONTEXT *ctx, const PJ *crs) { PJ *proj_crs_get_datum_ensemble(PJ_CONTEXT *ctx, const PJ *crs) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -8088,6 +8148,7 @@ int proj_datum_ensemble_get_member_count(PJ_CONTEXT *ctx, const PJ *datum_ensemble) { SANITIZE_CTX(ctx); if (!datum_ensemble) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return 0; } @@ -8114,6 +8175,7 @@ double proj_datum_ensemble_get_accuracy(PJ_CONTEXT *ctx, const PJ *datum_ensemble) { SANITIZE_CTX(ctx); if (!datum_ensemble) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return -1; } @@ -8152,6 +8214,7 @@ PJ *proj_datum_ensemble_get_member(PJ_CONTEXT *ctx, const PJ *datum_ensemble, int member_index) { SANITIZE_CTX(ctx); if (!datum_ensemble) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -8191,6 +8254,7 @@ PJ *proj_datum_ensemble_get_member(PJ_CONTEXT *ctx, const PJ *datum_ensemble, PJ *proj_crs_get_datum_forced(PJ_CONTEXT *ctx, const PJ *crs) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -8225,6 +8289,7 @@ double proj_dynamic_datum_get_frame_reference_epoch(PJ_CONTEXT *ctx, const PJ *datum) { SANITIZE_CTX(ctx); if (!datum) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return -1; } @@ -8259,6 +8324,7 @@ double proj_dynamic_datum_get_frame_reference_epoch(PJ_CONTEXT *ctx, PJ *proj_crs_get_coordinate_system(PJ_CONTEXT *ctx, const PJ *crs) { SANITIZE_CTX(ctx); if (!crs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -8281,6 +8347,7 @@ PJ *proj_crs_get_coordinate_system(PJ_CONTEXT *ctx, const PJ *crs) { PJ_COORDINATE_SYSTEM_TYPE proj_cs_get_type(PJ_CONTEXT *ctx, const PJ *cs) { SANITIZE_CTX(ctx); if (!cs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return PJ_CS_TYPE_UNKNOWN; } @@ -8330,6 +8397,7 @@ PJ_COORDINATE_SYSTEM_TYPE proj_cs_get_type(PJ_CONTEXT *ctx, const PJ *cs) { int proj_cs_get_axis_count(PJ_CONTEXT *ctx, const PJ *cs) { SANITIZE_CTX(ctx); if (!cs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return -1; } @@ -8373,6 +8441,7 @@ int proj_cs_get_axis_info(PJ_CONTEXT *ctx, const PJ *cs, int index, const char **out_unit_code) { SANITIZE_CTX(ctx); if (!cs) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -8526,6 +8595,7 @@ PJ *proj_coordoperation_create_inverse(PJ_CONTEXT *ctx, const PJ *obj) { SANITIZE_CTX(ctx); if (!obj) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } @@ -8557,6 +8627,7 @@ int proj_concatoperation_get_step_count(PJ_CONTEXT *ctx, const PJ *concatoperation) { SANITIZE_CTX(ctx); if (!concatoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return false; } @@ -8590,6 +8661,7 @@ PJ *proj_concatoperation_get_step(PJ_CONTEXT *ctx, const PJ *concatoperation, int i_step) { SANITIZE_CTX(ctx); if (!concatoperation) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); proj_log_error(ctx, __FUNCTION__, "missing required input"); return nullptr; } diff --git a/src/log.cpp b/src/log.cpp index 35e276de..edfba140 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -118,13 +118,13 @@ PJ_LOG_LEVEL proj_log_level (PJ_CONTEXT *ctx, PJ_LOG_LEVEL log_level) { /*****************************************************************************/ -void proj_log_error (PJ *P, const char *fmt, ...) { +void proj_log_error (const PJ *P, const char *fmt, ...) { /****************************************************************************** For reporting the most severe events. ******************************************************************************/ va_list args; va_start( args, fmt ); - pj_vlog (pj_get_ctx (P), PJ_LOG_ERROR , fmt, args); + pj_vlog (pj_get_ctx ((PJ*)P), PJ_LOG_ERROR , fmt, args); va_end( args ); } diff --git a/src/mlfn.hpp b/src/mlfn.hpp index 228c65a4..426dcb0e 100644 --- a/src/mlfn.hpp +++ b/src/mlfn.hpp @@ -66,7 +66,7 @@ inline_pj_inv_mlfn(PJ_CONTEXT *ctx, double arg, double es, const double *en, } *sinphi = s; *cosphi = c; - proj_context_errno_set( ctx, PJD_ERR_NON_CONV_INV_MERI_DIST ); + proj_context_errno_set( ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); return phi; } diff --git a/src/networkfilemanager.cpp b/src/networkfilemanager.cpp index 9edffaad..102d3d15 100644 --- a/src/networkfilemanager.cpp +++ b/src/networkfilemanager.cpp @@ -1315,7 +1315,7 @@ std::unique_ptr<File> NetworkFile::open(PJ_CONTEXT *ctx, const char *filename) { errorBuffer.resize(strlen(errorBuffer.data())); pj_log(ctx, PJ_LOG_ERROR, "Cannot open %s: %s", filename, errorBuffer.c_str()); - proj_context_errno_set(ctx, PJD_ERR_NETWORK_ERROR); + proj_context_errno_set(ctx, PROJ_ERR_OTHER_NETWORK_ERROR); } bool ok = false; @@ -1404,7 +1404,7 @@ size_t NetworkFile::read(void *buffer, size_t sizeBytes) { &nRead, errorBuffer.size(), &errorBuffer[0], m_ctx->networking.user_data); if (!m_handle) { - proj_context_errno_set(m_ctx, PJD_ERR_NETWORK_ERROR); + proj_context_errno_set(m_ctx, PROJ_ERR_OTHER_NETWORK_ERROR); return 0; } } else { @@ -1420,7 +1420,7 @@ size_t NetworkFile::read(void *buffer, size_t sizeBytes) { pj_log(m_ctx, PJ_LOG_ERROR, "Cannot read in %s: %s", m_url.c_str(), errorBuffer.c_str()); } - proj_context_errno_set(m_ctx, PJD_ERR_NETWORK_ERROR); + proj_context_errno_set(m_ctx, PROJ_ERR_OTHER_NETWORK_ERROR); return 0; } diff --git a/src/param.cpp b/src/param.cpp index 28d6bc3e..a716f9b9 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -220,7 +220,7 @@ PROJVALUE pj_param (PJ_CONTEXT *ctx, paralist *pl, const char *opt) { value.i = 1; break; default: - proj_context_errno_set (ctx, PJD_ERR_INVALID_BOOLEAN_PARAM); + proj_context_errno_set (ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); value.i = 0; break; } diff --git a/src/phi2.cpp b/src/phi2.cpp index 2f258e47..23793557 100644 --- a/src/phi2.cpp +++ b/src/phi2.cpp @@ -103,7 +103,7 @@ double pj_sinhpsi2tanphi(PJ_CONTEXT *ctx, const double taup, const double e) { break; } if (i == 0) - proj_context_errno_set(ctx, PJD_ERR_NON_CONV_SINHPSI2TANPHI); + proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); return tau; } diff --git a/src/pipeline.cpp b/src/pipeline.cpp index e9d11604..6a46ebd8 100644 --- a/src/pipeline.cpp +++ b/src/pipeline.cpp @@ -96,7 +96,6 @@ Thomas Knudsen, thokn@sdfe.dk, 2016-05-20 #define PJ_LIB__ -#include <errno.h> #include <math.h> #include <stddef.h> #include <string.h> @@ -430,8 +429,8 @@ PJ *OPERATION(pipeline,0) { // proj=pipeline step "x="""," u=" proj=pipeline step ste=""[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline p step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ste="[" u=" proj=pipeline step ""x=""""""""""" // Probably an issue with the quoting handling code // But doesn't hurt to add an extra safety check - proj_log_error (P, "Pipeline: too deep recursion"); - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); /* ERROR: nested pipelines */ + proj_log_error (P, _("Pipeline: too deep recursion")); + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); /* ERROR: nested pipelines */ } P->fwd4d = pipeline_forward_4d; @@ -453,24 +452,24 @@ PJ *OPERATION(pipeline,0) { P->opaque = new (std::nothrow) Pipeline(); if (nullptr==P->opaque) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /* ENOMEM */); argc = (int)argc_params (P->params); auto pipeline = static_cast<struct Pipeline*>(P->opaque); pipeline->argv = argv = argv_params (P->params, argc); if (nullptr==argv) - return destructor (P, ENOMEM); + return destructor (P, PROJ_ERR_INVALID_OP /* ENOMEM */); pipeline->current_argv = current_argv = static_cast<char**>(calloc (argc, sizeof (char *))); if (nullptr==current_argv) - return destructor (P, ENOMEM); + return destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); /* Do some syntactical sanity checking */ for (i = 0; i < argc; i++) { if (0==strcmp (argv_sentinel, argv[i])) { if (-1==i_pipeline) { - proj_log_error (P, "Pipeline: +step before +proj=pipeline"); - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); + proj_log_error (P, _("Pipeline: +step before +proj=pipeline")); + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); } if (0==nsteps) i_first_step = i; @@ -480,8 +479,8 @@ PJ *OPERATION(pipeline,0) { if (0==strcmp ("proj=pipeline", argv[i])) { if (-1 != i_pipeline) { - proj_log_error (P, "Pipeline: Nesting only allowed when child pipelines are wrapped in '+init's"); - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); /* ERROR: nested pipelines */ + proj_log_error (P, _("Pipeline: Nesting only allowed when child pipelines are wrapped in '+init's")); + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); /* ERROR: nested pipelines */ } i_pipeline = i; } @@ -489,10 +488,10 @@ PJ *OPERATION(pipeline,0) { nsteps--; /* Last instance of +step is just a sentinel */ if (-1==i_pipeline) - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); /* ERROR: no pipeline def */ + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); /* ERROR: no pipeline def */ if (0==nsteps) - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); /* ERROR: no pipeline def */ + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); /* ERROR: no pipeline def */ set_ellipsoid(P); @@ -532,8 +531,8 @@ PJ *OPERATION(pipeline,0) { /* The step init failed, but possibly without setting errno. If so, we say "malformed" */ int err_to_report = proj_errno(P); if (0==err_to_report) - err_to_report = PJD_ERR_MALFORMED_PIPELINE; - proj_log_error (P, "Pipeline: Bad step definition: %s (%s)", current_argv[0], proj_errno_string (err_to_report)); + err_to_report = PROJ_ERR_INVALID_OP_WRONG_SYNTAX; + proj_log_error (P, _("Pipeline: Bad step definition: %s (%s)"), current_argv[0], proj_context_errno_string (P->ctx, err_to_report)); return destructor (P, err_to_report); /* ERROR: bad pipeline def */ } next_step->parent = P; @@ -562,8 +561,8 @@ PJ *OPERATION(pipeline,0) { (!Q->inverted && (Q->fwd || Q->fwd3d || Q->fwd4d) ) ) { continue; } else { - proj_log_error (P, "Pipeline: A forward operation couldn't be constructed"); - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); + proj_log_error (P, _("Pipeline: A forward operation couldn't be constructed")); + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); } } @@ -612,8 +611,8 @@ PJ *OPERATION(pipeline,0) { continue; if ( curr_step_output != next_step_input ) { - proj_log_error (P, "Pipeline: Mismatched units between step %d and %d", i+1, i+2); - return destructor (P, PJD_ERR_MALFORMED_PIPELINE); + proj_log_error (P, _("Pipeline: Mismatched units between step %d and %d"), i+1, i+2); + return destructor (P, PROJ_ERR_INVALID_OP_WRONG_SYNTAX); } } @@ -682,7 +681,7 @@ static PJ *setup_pushpop(PJ *P) { auto pushpop = static_cast<struct PushPop*>(calloc (1, sizeof(struct PushPop))); P->opaque = pushpop; if (nullptr==P->opaque) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); if (pj_param_exists(P->params, "v_1")) pushpop->v1 = true; @@ -610,6 +610,33 @@ double PROJ_DLL proj_xyz_dist (PJ_COORD a, PJ_COORD b); /* Geodesic distance (in meter) + fwd and rev azimuth between two points on the ellipsoid */ PJ_COORD PROJ_DLL proj_geod (const PJ *P, PJ_COORD a, PJ_COORD b); +/* PROJ error codes */ + +/** Error codes typically related to coordinate operation initalization + * Note: some of them can also be emitted during coordinate transformation, + * like PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID in case the resource loading + * is differed until it is really needed. + */ +#define PROJ_ERR_INVALID_OP 1024 /* other/unspecified error related to coordinate operation initialization */ +#define PROJ_ERR_INVALID_OP_WRONG_SYNTAX (PROJ_ERR_INVALID_OP+1) /* invalid pipeline structure, missing +proj argument, etc */ +#define PROJ_ERR_INVALID_OP_MISSING_ARG (PROJ_ERR_INVALID_OP+2) /* missing required operation parameter */ +#define PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE (PROJ_ERR_INVALID_OP+3) /* one of the operation parameter has an illegal value */ +#define PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS (PROJ_ERR_INVALID_OP+4) /* mutually exclusive arguments */ +#define PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID (PROJ_ERR_INVALID_OP+5) /* file not found (particular case of PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE) */ + +/** Error codes related to transformation on a specific coordinate */ +#define PROJ_ERR_COORD_TRANSFM 2048 /* other error related to coordinate transformation */ +#define PROJ_ERR_COORD_TRANSFM_INVALID_COORD (PROJ_ERR_COORD_TRANSFM+1) /* for e.g lat > 90deg */ +#define PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN (PROJ_ERR_COORD_TRANSFM+2) /* coordinate is outside of the projection domain. e.g approximate mercator with |longitude - lon_0| > 90deg, or iterative convergence method failed */ +#define PROJ_ERR_COORD_TRANSFM_NO_OPERATION (PROJ_ERR_COORD_TRANSFM+3) /* no operation found, e.g if no match the required accuracy, or if ballpark transformations were asked to not be used and they would be only such candidate */ +#define PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID (PROJ_ERR_COORD_TRANSFM+4) /* point to transform falls outside grid or subgrid */ +#define PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA (PROJ_ERR_COORD_TRANSFM+5) /* point to transform falls in a grid cell that evaluates to nodata */ + +/** Other type of errors */ +#define PROJ_ERR_OTHER 4096 +#define PROJ_ERR_OTHER_API_MISUSE (PROJ_ERR_OTHER+1) /* error related to a misuse of PROJ API */ +#define PROJ_ERR_OTHER_NO_INVERSE_OP (PROJ_ERR_OTHER+2) /* no inverse method available */ +#define PROJ_ERR_OTHER_NETWORK_ERROR (PROJ_ERR_OTHER+3) /* failure when accessing a network resource */ /* Set or read error level */ int PROJ_DLL proj_context_errno (PJ_CONTEXT *ctx); @@ -617,7 +644,8 @@ int PROJ_DLL proj_errno (const PJ *P); int PROJ_DLL proj_errno_set (const PJ *P, int err); int PROJ_DLL proj_errno_reset (const PJ *P); int PROJ_DLL proj_errno_restore (const PJ *P, int err); -const char PROJ_DLL * proj_errno_string (int err); +const char PROJ_DLL * proj_errno_string (int err); /* deprecated. use proj_context_errno_string() */ +const char PROJ_DLL * proj_context_errno_string(PJ_CONTEXT* ctx, int err); PJ_LOG_LEVEL PROJ_DLL proj_log_level (PJ_CONTEXT *ctx, PJ_LOG_LEVEL log_level); void PROJ_DLL proj_log_func (PJ_CONTEXT *ctx, void *app_data, PJ_LOG_FUNCTION logf); diff --git a/src/proj_internal.h b/src/proj_internal.h index 32aaa1ec..bf9e5386 100644 --- a/src/proj_internal.h +++ b/src/proj_internal.h @@ -189,7 +189,10 @@ PJ_COORD pj_inv4d (PJ_COORD coo, PJ *P); PJ_COORD PROJ_DLL pj_approx_2D_trans (PJ *P, PJ_DIRECTION direction, PJ_COORD coo); PJ_COORD PROJ_DLL pj_approx_3D_trans (PJ *P, PJ_DIRECTION direction, PJ_COORD coo); -void PROJ_DLL proj_log_error (PJ *P, const char *fmt, ...); +/* Provision for gettext translatable strings */ +#define _(str) (str) + +void PROJ_DLL proj_log_error (const PJ *P, const char *fmt, ...); void proj_log_debug (PJ *P, const char *fmt, ...); void proj_log_trace (PJ *P, const char *fmt, ...); @@ -598,72 +601,6 @@ struct FACTORS { int code; /* always 0 */ }; -/* library errors */ -#define PJD_ERR_NO_ARGS -1 -#define PJD_ERR_NO_OPTION_IN_INIT_FILE -2 -#define PJD_ERR_NO_COLON_IN_INIT_STRING -3 -#define PJD_ERR_PROJ_NOT_NAMED -4 -#define PJD_ERR_UNKNOWN_PROJECTION_ID -5 -#define PJD_ERR_INVALID_ECCENTRICITY -6 -#define PJD_ERR_UNKNOWN_UNIT_ID -7 -#define PJD_ERR_INVALID_BOOLEAN_PARAM -8 -#define PJD_ERR_UNKNOWN_ELLP_PARAM -9 -#define PJD_ERR_REV_FLATTENING_IS_ZERO -10 -#define PJD_ERR_REF_RAD_LARGER_THAN_90 -11 -#define PJD_ERR_ES_LESS_THAN_ZERO -12 -#define PJD_ERR_MAJOR_AXIS_NOT_GIVEN -13 -#define PJD_ERR_LAT_OR_LON_EXCEED_LIMIT -14 -#define PJD_ERR_INVALID_X_OR_Y -15 -#define PJD_ERR_WRONG_FORMAT_DMS_VALUE -16 -#define PJD_ERR_NON_CONV_INV_MERI_DIST -17 -#define PJD_ERR_NON_CONV_SINHPSI2TANPHI -18 -#define PJD_ERR_ACOS_ASIN_ARG_TOO_LARGE -19 -#define PJD_ERR_TOLERANCE_CONDITION -20 -#define PJD_ERR_CONIC_LAT_EQUAL -21 -#define PJD_ERR_LAT_LARGER_THAN_90 -22 -#define PJD_ERR_LAT1_IS_ZERO -23 -#define PJD_ERR_LAT_TS_LARGER_THAN_90 -24 -#define PJD_ERR_CONTROL_POINT_NO_DIST -25 -#define PJD_ERR_NO_ROTATION_PROJ -26 -#define PJD_ERR_W_OR_M_ZERO_OR_LESS -27 -#define PJD_ERR_LSAT_NOT_IN_RANGE -28 -#define PJD_ERR_PATH_NOT_IN_RANGE -29 -#define PJD_ERR_INVALID_H -30 -#define PJD_ERR_K_LESS_THAN_ZERO -31 -#define PJD_ERR_LAT_1_OR_2_ZERO_OR_90 -32 -#define PJD_ERR_LAT_0_OR_ALPHA_EQ_90 -33 -#define PJD_ERR_ELLIPSOID_USE_REQUIRED -34 -#define PJD_ERR_INVALID_UTM_ZONE -35 -/* -36 no longer used */ -#define PJD_ERR_FAILED_TO_FIND_PROJ -37 -#define PJD_ERR_FAILED_TO_LOAD_GRID -38 -#define PJD_ERR_INVALID_M_OR_N -39 -#define PJD_ERR_N_OUT_OF_RANGE -40 -#define PJD_ERR_LAT_1_2_UNSPECIFIED -41 -#define PJD_ERR_ABS_LAT1_EQ_ABS_LAT2 -42 -#define PJD_ERR_LAT_0_HALF_PI_FROM_MEAN -43 -#define PJD_ERR_UNPARSEABLE_CS_DEF -44 -#define PJD_ERR_GEOCENTRIC -45 -#define PJD_ERR_UNKNOWN_PRIME_MERIDIAN -46 -#define PJD_ERR_AXIS -47 -#define PJD_ERR_GRID_AREA -48 -#define PJD_ERR_INVALID_SWEEP_AXIS -49 -#define PJD_ERR_MALFORMED_PIPELINE -50 -#define PJD_ERR_UNIT_FACTOR_LESS_THAN_0 -51 -#define PJD_ERR_INVALID_SCALE -52 -#define PJD_ERR_NON_CONVERGENT -53 -#define PJD_ERR_MISSING_ARGS -54 -#define PJD_ERR_LAT_0_IS_ZERO -55 -#define PJD_ERR_ELLIPSOIDAL_UNSUPPORTED -56 -#define PJD_ERR_TOO_MANY_INITS -57 -#define PJD_ERR_INVALID_ARG -58 -#define PJD_ERR_INCONSISTENT_UNIT -59 -#define PJD_ERR_MUTUALLY_EXCLUSIVE_ARGS -60 -#define PJD_ERR_GENERIC_ERROR -61 -#define PJD_ERR_NETWORK_ERROR -62 -/* NOTE: Remember to update src/strerrno.cpp, src/apps/gie.cpp and transient_error in */ -/* src/transform.cpp when adding new value */ - // Legacy struct projFileAPI_t; @@ -707,6 +644,7 @@ struct projFileApiCallbackAndData /* proj thread context */ struct pj_ctx{ + std::string lastFullErrorMessage{}; // used by proj_context_errno_string int last_errno = 0; int debug_level = 0; void (*logger)(void *, int, const char *) = nullptr; diff --git a/src/proj_mdist.cpp b/src/proj_mdist.cpp index ed07ffd1..9a819861 100644 --- a/src/proj_mdist.cpp +++ b/src/proj_mdist.cpp @@ -124,6 +124,6 @@ proj_inv_mdist(PJ_CONTEXT *ctx, double dist, const void *data) { return phi; } /* convergence failed */ - proj_context_errno_set(ctx, PJD_ERR_NON_CONV_INV_MERI_DIST); + proj_context_errno_set(ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return phi; } diff --git a/src/projections/adams.cpp b/src/projections/adams.cpp index d1217ff1..44e98a2c 100644 --- a/src/projections/adams.cpp +++ b/src/projections/adams.cpp @@ -99,7 +99,7 @@ static PJ_XY adams_forward(PJ_LP lp, PJ *P) { switch (Q->mode) { case GUYOU: if ((fabs(lp.lam) - TOL) > M_PI_2) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } @@ -119,7 +119,7 @@ static PJ_XY adams_forward(PJ_LP lp, PJ *P) { break; case PEIRCE_Q: { if( lp.phi < -TOL ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } const double sl = sin(lp.lam); @@ -134,7 +134,7 @@ static PJ_XY adams_forward(PJ_LP lp, PJ *P) { case ADAMS_HEMI: { const double sp = sin(lp.phi); if ((fabs(lp.lam) - TOL) > M_PI_2) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } a = cos(lp.phi) * sin(lp.lam); @@ -208,7 +208,7 @@ static PJ *setup(PJ *P, projection_type mode) { calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->es = 0; diff --git a/src/projections/aea.cpp b/src/projections/aea.cpp index af0f292d..c5b03158 100644 --- a/src/projections/aea.cpp +++ b/src/projections/aea.cpp @@ -107,7 +107,7 @@ static PJ_XY aea_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoid/spheroid, forward struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); Q->rho = Q->c - (Q->ellips ? Q->n * pj_qsfn(sin(lp.phi), P->e, P->one_es) : Q->n2 * sin(lp.phi));; if (Q->rho < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } Q->rho = Q->dd * sqrt(Q->rho); @@ -134,12 +134,12 @@ static PJ_LP aea_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoid/spheroid, inverse lp.phi = (Q->c - lp.phi * lp.phi) / Q->n; if (fabs(Q->ec - fabs(lp.phi)) > TOL7) { if (fabs(lp.phi) > 2 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } lp.phi = phi1_(lp.phi, P->e, P->one_es); if (lp.phi == HUGE_VAL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } } else @@ -167,10 +167,21 @@ static PJ *setup(PJ *P) { P->inv = aea_e_inverse; P->fwd = aea_e_forward; - if (fabs(Q->phi1) > M_HALFPI || fabs(Q->phi2) > M_HALFPI) - return destructor(P, PJD_ERR_LAT_LARGER_THAN_90); + if (fabs(Q->phi1) > M_HALFPI) + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be <= 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if (fabs(Q->phi2) > M_HALFPI) + { + proj_log_error(P, _("Invalid value for lat_2: |lat_2| should be <= 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (fabs(Q->phi1 + Q->phi2) < EPS10) - return destructor(P, PJD_ERR_CONIC_LAT_EQUAL); + { + proj_log_error(P, _("Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } double sinphi = sin(Q->phi1); Q->n = sinphi; double cosphi = cos(Q->phi1); @@ -197,7 +208,8 @@ static PJ *setup(PJ *P) { Q->n = (m1 * m1 - m2 * m2) / (ml2 - ml1); if (Q->n == 0) { // Not quite, but es is very close to 1... - return destructor(P, PJD_ERR_INVALID_ECCENTRICITY); + proj_log_error(P, _("Invalid value for eccentricity")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } Q->ec = 1. - .5 * P->one_es * log((1. - P->e) / @@ -221,7 +233,7 @@ static PJ *setup(PJ *P) { PJ *PROJECTION(aea) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -234,7 +246,7 @@ PJ *PROJECTION(aea) { PJ *PROJECTION(leac) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; diff --git a/src/projections/aeqd.cpp b/src/projections/aeqd.cpp index d5d90b62..2a42f379 100644 --- a/src/projections/aeqd.cpp +++ b/src/projections/aeqd.cpp @@ -149,7 +149,7 @@ static PJ_XY aeqd_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward oblcon: if (fabs(fabs(xy.y) - 1.) < TOL) if (xy.y < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } else @@ -168,7 +168,7 @@ oblcon: /*-fallthrough*/ case S_POLE: if (fabs(lp.phi - M_HALFPI) < EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.y = (M_HALFPI + lp.phi); @@ -239,7 +239,7 @@ static PJ_LP aeqd_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse c_rh = hypot(xy.x, xy.y); if (c_rh > M_PI) { if (c_rh - EPS10 > M_PI) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } c_rh = M_PI; @@ -276,7 +276,7 @@ static PJ_LP aeqd_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse PJ *PROJECTION(aeqd) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; diff --git a/src/projections/airy.cpp b/src/projections/airy.cpp index 15ff60d8..d162aba6 100644 --- a/src/projections/airy.cpp +++ b/src/projections/airy.cpp @@ -74,14 +74,14 @@ static PJ_XY airy_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward if (Q->mode == OBLIQ) cosz = Q->sinph0 * sinphi + Q->cosph0 * cosz; if (!Q->no_cut && cosz < -EPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } s = 1. - cosz; if (fabs(s) > EPS) { t = 0.5 * (1. + cosz); if(t == 0) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } Krho = -log(t)/s - Q->Cb / t; @@ -97,7 +97,7 @@ static PJ_XY airy_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward case N_POLE: lp.phi = fabs(Q->p_halfpi - lp.phi); if (!Q->no_cut && (lp.phi - EPS) > M_HALFPI) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } lp.phi *= 0.5; @@ -122,7 +122,7 @@ PJ *PROJECTION(airy) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; diff --git a/src/projections/aitoff.cpp b/src/projections/aitoff.cpp index 857ebb80..1051c711 100644 --- a/src/projections/aitoff.cpp +++ b/src/projections/aitoff.cpp @@ -123,7 +123,7 @@ static PJ_LP aitoff_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver C = 1. - D * D; const double denom = pow(C, 1.5); if( denom == 0 ) { - proj_errno_set(P, PJD_ERR_NON_CONVERGENT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } D = acos(D) / denom; @@ -170,7 +170,7 @@ static PJ_LP aitoff_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver if (iter == MAXITER && round == MAXROUND) { - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); /* fprintf(stderr, "Warning: Accuracy of 1e-12 not reached. Last increments: dlat=%e and dlon=%e\n", dp, dl); */ } @@ -189,7 +189,7 @@ static PJ *setup(PJ *P) { PJ *PROJECTION(aitoff) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->mode = AITOFF; @@ -200,13 +200,16 @@ PJ *PROJECTION(aitoff) { PJ *PROJECTION(wintri) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->mode = WINKEL_TRIPEL; if (pj_param(P->ctx, P->params, "tlat_1").i) { if ((Q->cosphi1 = cos(pj_param(P->ctx, P->params, "rlat_1").f)) == 0.) - return pj_default_destructor (P, PJD_ERR_LAT_LARGER_THAN_90); + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } else /* 50d28' or acos(2/pi) */ Q->cosphi1 = 0.636619772367581343; diff --git a/src/projections/bacon.cpp b/src/projections/bacon.cpp index 7ff2a7ac..c236e943 100644 --- a/src/projections/bacon.cpp +++ b/src/projections/bacon.cpp @@ -45,7 +45,7 @@ static PJ_XY bacon_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar PJ *PROJECTION(bacon) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->bacn = 1; @@ -59,7 +59,7 @@ PJ *PROJECTION(bacon) { PJ *PROJECTION(apian) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->bacn = Q->ortl = 0; @@ -72,7 +72,7 @@ PJ *PROJECTION(apian) { PJ *PROJECTION(ortel) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->bacn = 0; diff --git a/src/projections/bertin1953.cpp b/src/projections/bertin1953.cpp index 58509e16..db7aa7c8 100644 --- a/src/projections/bertin1953.cpp +++ b/src/projections/bertin1953.cpp @@ -77,7 +77,7 @@ static PJ_XY bertin1953_s_forward (PJ_LP lp, PJ *P) { PJ *PROJECTION(bertin1953) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->lam0 = 0; diff --git a/src/projections/bipc.cpp b/src/projections/bipc.cpp index 743acd1c..e89e189a 100644 --- a/src/projections/bipc.cpp +++ b/src/projections/bipc.cpp @@ -60,7 +60,7 @@ static PJ_XY bipc_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward z = S20 * sphi + C20 * cphi * cdlam; if (fabs(z) > 1.) { if (fabs(z) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } else z = z < 0. ? -1. : 1.; @@ -74,7 +74,7 @@ static PJ_XY bipc_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward z = S45 * (sphi + cphi * cdlam); if (fabs(z) > 1.) { if (fabs(z) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } else z = z < 0. ? -1. : 1.; @@ -84,19 +84,19 @@ static PJ_XY bipc_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward xy.y = -rhoc; } if (z < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } t = pow(tan(.5 * z), n); r = F * t; if ((al = .5 * (R104 - z)) < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } al = (t + pow(al, n)) / T; if (fabs(al) > 1.) { if (fabs(al) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } else al = al < 0. ? -1. : 1.; @@ -153,7 +153,7 @@ static PJ_LP bipc_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse rl = r; } if (! i) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } Az = Av - Az / n; @@ -170,7 +170,7 @@ static PJ_LP bipc_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse PJ *PROJECTION(bipc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->noskew = pj_param(P->ctx, P->params, "bns").i; diff --git a/src/projections/bonne.cpp b/src/projections/bonne.cpp index 7817e968..1728a477 100644 --- a/src/projections/bonne.cpp +++ b/src/projections/bonne.cpp @@ -65,7 +65,7 @@ static PJ_LP bonne_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers rh = hypot(xy.x, xy.y); lp.phi = Q->cphi1 + Q->phi1 - rh; if (fabs(lp.phi) > M_HALFPI) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } if (fabs(fabs(lp.phi) - M_HALFPI) <= EPS10) @@ -91,7 +91,7 @@ static PJ_LP bonne_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, invers } else if (fabs(s - M_HALFPI) <= EPS10) lp.lam = 0.; else { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } return lp; @@ -115,18 +115,21 @@ PJ *PROJECTION(bonne) { double c; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f; if (fabs(Q->phi1) < EPS10) - return destructor (P, PJD_ERR_LAT1_IS_ZERO); + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be > 0")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (P->es != 0.0) { Q->en = pj_enfn(P->es); if (nullptr==Q->en) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->am1 = sin(Q->phi1); c = cos(Q->phi1); Q->m1 = pj_mlfn(Q->phi1, Q->am1, c, Q->en); diff --git a/src/projections/calcofi.cpp b/src/projections/calcofi.cpp index d1e96de8..b9528ab9 100644 --- a/src/projections/calcofi.cpp +++ b/src/projections/calcofi.cpp @@ -44,7 +44,7 @@ static PJ_XY calcofi_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forw line as xy xy, r, o form a right triangle */ if (fabs(fabs(lp.phi) - M_HALFPI) <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } @@ -73,7 +73,7 @@ static PJ_XY calcofi_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forw double l2; double ry; if (fabs(fabs(lp.phi) - M_HALFPI) <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.x = lp.lam; diff --git a/src/projections/cass.cpp b/src/projections/cass.cpp index f5531f6a..9902f9d7 100644 --- a/src/projections/cass.cpp +++ b/src/projections/cass.cpp @@ -113,12 +113,12 @@ PJ *PROJECTION(cass) { /* otherwise it's ellipsoidal */ P->opaque = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==P->opaque) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->destructor = destructor; static_cast<struct pj_opaque*>(P->opaque)->en = pj_enfn (P->es); if (nullptr==static_cast<struct pj_opaque*>(P->opaque)->en) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); static_cast<struct pj_opaque*>(P->opaque)->m0 = pj_mlfn (P->phi0, sin (P->phi0), cos (P->phi0), static_cast<struct pj_opaque*>(P->opaque)->en); P->inv = cass_e_inverse; diff --git a/src/projections/cc.cpp b/src/projections/cc.cpp index 244e185d..f15a95bd 100644 --- a/src/projections/cc.cpp +++ b/src/projections/cc.cpp @@ -12,7 +12,7 @@ PROJ_HEAD(cc, "Central Cylindrical") "\n\tCyl, Sph"; static PJ_XY cc_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward */ PJ_XY xy = {0.0,0.0}; if (fabs (fabs(lp.phi) - M_HALFPI) <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.x = lp.lam; diff --git a/src/projections/ccon.cpp b/src/projections/ccon.cpp index 7b3b7105..5f58d536 100644 --- a/src/projections/ccon.cpp +++ b/src/projections/ccon.cpp @@ -84,16 +84,18 @@ PJ *PROJECTION(ccon) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f; if (fabs(Q->phi1) < EPS10) - return destructor (P, PJD_ERR_LAT1_IS_ZERO); - + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be > 0")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (!(Q->en = pj_enfn(P->es))) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->sinphi1 = sin(Q->phi1); Q->cosphi1 = cos(Q->phi1); diff --git a/src/projections/cea.cpp b/src/projections/cea.cpp index b7874b90..0d850b49 100644 --- a/src/projections/cea.cpp +++ b/src/projections/cea.cpp @@ -53,7 +53,7 @@ static PJ_LP cea_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse lp.phi = asin(xy.y); lp.lam = xy.x / P->k0; } else { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } return (lp); @@ -75,15 +75,19 @@ PJ *PROJECTION(cea) { double t = 0.0; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; if (pj_param(P->ctx, P->params, "tlat_ts").i) { - P->k0 = cos(t = pj_param(P->ctx, P->params, "rlat_ts").f); + t = pj_param(P->ctx, P->params, "rlat_ts").f; + P->k0 = cos(t); if (P->k0 < 0.) - return pj_default_destructor (P, PJD_ERR_LAT_TS_LARGER_THAN_90); + { + proj_log_error(P, _("Invalid value for lat_ts: |lat_ts| should be <= 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } if (P->es != 0.0) { t = sin(t); @@ -91,7 +95,7 @@ PJ *PROJECTION(cea) { P->e = sqrt(P->es); Q->apa = pj_authset(P->es); if (!(Q->apa)) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->qp = pj_qsfn(1., P->e, P->one_es); P->inv = cea_e_inverse; diff --git a/src/projections/chamb.cpp b/src/projections/chamb.cpp index b315832a..ca5d6d82 100644 --- a/src/projections/chamb.cpp +++ b/src/projections/chamb.cpp @@ -105,7 +105,7 @@ PJ *PROJECTION(chamb) { char line[10]; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; @@ -123,7 +123,10 @@ PJ *PROJECTION(chamb) { Q->c[i].v = vect(P->ctx,Q->c[j].phi - Q->c[i].phi, Q->c[i].cosphi, Q->c[i].sinphi, Q->c[j].cosphi, Q->c[j].sinphi, Q->c[j].lam - Q->c[i].lam); if (Q->c[i].v.r == 0.0) - return pj_default_destructor (P, PJD_ERR_CONTROL_POINT_NO_DIST); + { + proj_log_error(P, _("Invalid value for control points: they should be distinct")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } /* co-linearity problem ignored for now */ } Q->beta_0 = lc(P->ctx,Q->c[0].v.r, Q->c[2].v.r, Q->c[1].v.r); diff --git a/src/projections/col_urban.cpp b/src/projections/col_urban.cpp index de0c178f..6d8157b6 100644 --- a/src/projections/col_urban.cpp +++ b/src/projections/col_urban.cpp @@ -56,7 +56,7 @@ static PJ_LP col_urban_inverse (PJ_XY xy, PJ *P) { PJ *PROJECTION(col_urban) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; const double h0_unscaled = pj_param(P->ctx, P->params, "dh_0").f; diff --git a/src/projections/collg.cpp b/src/projections/collg.cpp index 1b9d2da7..958dfddb 100644 --- a/src/projections/collg.cpp +++ b/src/projections/collg.cpp @@ -32,7 +32,7 @@ static PJ_LP collg_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers if (fabs(lp.phi) < 1.) lp.phi = asin(lp.phi); else if (fabs(lp.phi) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { lp.phi = lp.phi < 0. ? -M_HALFPI : M_HALFPI; diff --git a/src/projections/comill.cpp b/src/projections/comill.cpp index 44524990..910d8aa7 100644 --- a/src/projections/comill.cpp +++ b/src/projections/comill.cpp @@ -66,7 +66,7 @@ static PJ_LP comill_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver } } if( i == 0 ) - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); lp.phi = yc; /* longitude */ diff --git a/src/projections/eck2.cpp b/src/projections/eck2.cpp index 0d9fd5fa..891ad30e 100644 --- a/src/projections/eck2.cpp +++ b/src/projections/eck2.cpp @@ -34,7 +34,7 @@ static PJ_LP eck2_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse lp.phi = (4. - lp.phi * lp.phi) * C13; if (fabs(lp.phi) >= 1.) { if (fabs(lp.phi) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { lp.phi = lp.phi < 0. ? -M_HALFPI : M_HALFPI; diff --git a/src/projections/eck3.cpp b/src/projections/eck3.cpp index 2563053f..cd0ccdf9 100644 --- a/src/projections/eck3.cpp +++ b/src/projections/eck3.cpp @@ -54,7 +54,7 @@ static PJ *setup(PJ *P) { PJ *PROJECTION(eck3) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 0.42223820031577120149; @@ -69,7 +69,7 @@ PJ *PROJECTION(eck3) { PJ *PROJECTION(kav7) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; /* Defined twice in original code - Using 0.866..., @@ -87,7 +87,7 @@ PJ *PROJECTION(kav7) { PJ *PROJECTION(wag6) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 0.94745; @@ -102,7 +102,7 @@ PJ *PROJECTION(wag6) { PJ *PROJECTION(putp1) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 1.89490; diff --git a/src/projections/eqc.cpp b/src/projections/eqc.cpp index 9ebc9286..fd385bb2 100644 --- a/src/projections/eqc.cpp +++ b/src/projections/eqc.cpp @@ -41,11 +41,14 @@ static PJ_LP eqc_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse PJ *PROJECTION(eqc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if ((Q->rc = cos(pj_param(P->ctx, P->params, "rlat_ts").f)) <= 0.) - return pj_default_destructor (P, PJD_ERR_LAT_TS_LARGER_THAN_90); + { + proj_log_error(P, _("Invalid value for lat_ts: |lat_ts| should be <= 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } P->inv = eqc_s_inverse; P->fwd = eqc_s_forward; P->es = 0.; diff --git a/src/projections/eqdc.cpp b/src/projections/eqdc.cpp index 28767d74..4f49c136 100644 --- a/src/projections/eqdc.cpp +++ b/src/projections/eqdc.cpp @@ -79,20 +79,32 @@ PJ *PROJECTION(eqdc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*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; - if (fabs(Q->phi1) > M_HALFPI || fabs(Q->phi2) > M_HALFPI) - return destructor(P, PJD_ERR_LAT_LARGER_THAN_90); + if (fabs(Q->phi1) > M_HALFPI) + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be <= 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + + if (fabs(Q->phi2) > M_HALFPI) + { + proj_log_error(P, _("Invalid value for lat_2: |lat_2| should be <= 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (fabs(Q->phi1 + Q->phi2) < EPS10) - return destructor (P, PJD_ERR_CONIC_LAT_EQUAL); + { + proj_log_error(P, _("Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (!(Q->en = pj_enfn(P->es))) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); sinphi = sin(Q->phi1); Q->n = sinphi; @@ -111,7 +123,8 @@ PJ *PROJECTION(eqdc) { (pj_mlfn(Q->phi2, sinphi, cosphi, Q->en) - ml1); if (Q->n == 0) { // Not quite, but es is very close to 1... - return destructor(P, PJD_ERR_INVALID_ECCENTRICITY); + proj_log_error(P, _("Invalid value for eccentricity")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } Q->c = ml1 + m1 / Q->n; @@ -121,7 +134,10 @@ PJ *PROJECTION(eqdc) { if (secant) Q->n = (cosphi - cos(Q->phi2)) / (Q->phi2 - Q->phi1); if (Q->n == 0) - return destructor (P, PJD_ERR_CONIC_LAT_EQUAL); + { + proj_log_error(P, _("Invalid value for lat_1 and lat_2: lat_1 + lat_2 should be > 0")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->c = Q->phi1 + cos(Q->phi1) / Q->n; Q->rho0 = Q->c - P->phi0; } diff --git a/src/projections/eqearth.cpp b/src/projections/eqearth.cpp index 2ef2775b..9600e039 100644 --- a/src/projections/eqearth.cpp +++ b/src/projections/eqearth.cpp @@ -110,7 +110,7 @@ static PJ_LP eqearth_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal/sphe } if( i == 0 ) { - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); return lp; } @@ -145,7 +145,7 @@ static PJ *destructor (PJ *P, int errlev) { /* Destructor */ PJ *PROJECTION(eqearth) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; P->fwd = eqearth_e_forward; @@ -156,7 +156,7 @@ PJ *PROJECTION(eqearth) { if (P->es != 0.0) { Q->apa = pj_authset(P->es); /* For auth_lat(). */ if (nullptr == Q->apa) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->qp = pj_qsfn(1.0, P->e, P->one_es); /* For auth_lat(). */ Q->rqda = sqrt(0.5*Q->qp); /* Authalic radius divided by major axis */ } diff --git a/src/projections/fouc_s.cpp b/src/projections/fouc_s.cpp index f7607635..5a560d97 100644 --- a/src/projections/fouc_s.cpp +++ b/src/projections/fouc_s.cpp @@ -57,12 +57,15 @@ static PJ_LP fouc_s_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver PJ *PROJECTION(fouc_s) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->n = pj_param(P->ctx, P->params, "dn").f; if (Q->n < 0. || Q->n > 1.) - return pj_default_destructor (P, PJD_ERR_N_OUT_OF_RANGE); + { + proj_log_error(P, _("Invalid value for n: it should be in [0,1] range.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->n1 = 1. - Q->n; P->es = 0; diff --git a/src/projections/geos.cpp b/src/projections/geos.cpp index 5de4c7ca..8d05dd24 100644 --- a/src/projections/geos.cpp +++ b/src/projections/geos.cpp @@ -99,7 +99,7 @@ static PJ_XY geos_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward /* Check visibility. */ if (((Q->radius_g - Vx) * Vx - Vy * Vy - Vz * Vz * Q->radius_p_inv2) < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } @@ -138,7 +138,7 @@ static PJ_LP geos_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse b = 2 * Q->radius_g * Vx; const double det = (b * b) - 4 * a * Q->C; if (det < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } @@ -178,7 +178,7 @@ static PJ_LP geos_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse b = 2 * Q->radius_g * Vx; const double det = (b * b) - 4 * a * Q->C; if (det < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } @@ -201,7 +201,7 @@ PJ *PROJECTION(geos) { char *sweep_axis; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->h = pj_param(P->ctx, P->params, "dh").f; @@ -212,7 +212,10 @@ PJ *PROJECTION(geos) { else { if ((sweep_axis[0] != 'x' && sweep_axis[0] != 'y') || sweep_axis[1] != '\0') - return pj_default_destructor (P, PJD_ERR_INVALID_SWEEP_AXIS); + { + proj_log_error(P, _("Invalid value for sweep: it should be equal to x or y.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (sweep_axis[0] == 'x') Q->flip_axis = 1; @@ -222,7 +225,10 @@ PJ *PROJECTION(geos) { Q->radius_g_1 = Q->h / P->a; if ( Q->radius_g_1 <= 0 || Q->radius_g_1 > 1e10 ) - return pj_default_destructor (P, PJD_ERR_INVALID_H); + { + proj_log_error(P, _("Invalid value for h.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->radius_g = 1. + Q->radius_g_1; Q->C = Q->radius_g * Q->radius_g - 1.0; if (P->es != 0.0) { diff --git a/src/projections/gn_sinu.cpp b/src/projections/gn_sinu.cpp index ef312613..5d3f9491 100644 --- a/src/projections/gn_sinu.cpp +++ b/src/projections/gn_sinu.cpp @@ -46,7 +46,7 @@ static PJ_LP gn_sinu_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inve } else if ((s - EPS10) < M_HALFPI) { lp.lam = 0.; } else { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); } return lp; @@ -71,7 +71,7 @@ static PJ_XY gn_sinu_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forw break; } if (!i) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } @@ -123,12 +123,12 @@ static void setup(PJ *P) { PJ *PROJECTION(sinu) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; if (!(Q->en = pj_enfn(P->es))) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); if (P->es != 0.0) { P->inv = gn_sinu_e_inverse; @@ -145,7 +145,7 @@ PJ *PROJECTION(sinu) { PJ *PROJECTION(eck6) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -160,7 +160,7 @@ PJ *PROJECTION(eck6) { PJ *PROJECTION(mbtfps) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -175,17 +175,33 @@ PJ *PROJECTION(mbtfps) { PJ *PROJECTION(gn_sinu) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; - if (pj_param(P->ctx, P->params, "tn").i && pj_param(P->ctx, P->params, "tm").i) { - Q->n = pj_param(P->ctx, P->params, "dn").f; - Q->m = pj_param(P->ctx, P->params, "dm").f; - if (Q->n <= 0 || Q->m < 0) - return destructor (P, PJD_ERR_INVALID_M_OR_N); - } else - return destructor (P, PJD_ERR_INVALID_M_OR_N); + if (!pj_param(P->ctx, P->params, "tn").i ) + { + proj_log_error(P, _("Missing parameter n.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } + if (!pj_param(P->ctx, P->params, "tm").i ) + { + proj_log_error(P, _("Missing parameter m.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } + + Q->n = pj_param(P->ctx, P->params, "dn").f; + Q->m = pj_param(P->ctx, P->params, "dm").f; + if (Q->n <= 0) + { + proj_log_error(P, _("Invalid value for n: it should be > 0.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if (Q->m < 0) + { + proj_log_error(P, _("Invalid value for m: it should be >= 0.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } setup(P); diff --git a/src/projections/gnom.cpp b/src/projections/gnom.cpp index 9abbb7ce..0d53cfab 100644 --- a/src/projections/gnom.cpp +++ b/src/projections/gnom.cpp @@ -54,7 +54,7 @@ static PJ_XY gnom_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward } if (xy.y <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } @@ -126,7 +126,7 @@ static PJ_LP gnom_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse PJ *PROJECTION(gnom) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if (fabs(fabs(P->phi0) - M_HALFPI) < EPS10) { diff --git a/src/projections/goode.cpp b/src/projections/goode.cpp index c0afd2d8..1107d203 100644 --- a/src/projections/goode.cpp +++ b/src/projections/goode.cpp @@ -64,7 +64,7 @@ static PJ *destructor (PJ *P, int errlev) { /* Destructor */ PJ *PROJECTION(goode) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -72,14 +72,14 @@ PJ *PROJECTION(goode) { Q->sinu = pj_sinu(nullptr); Q->moll = pj_moll(nullptr); if (Q->sinu == nullptr || Q->moll == nullptr) - return destructor (P, ENOMEM); + return destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->sinu->es = 0.; Q->sinu->ctx = P->ctx; Q->moll->ctx = P->ctx; Q->sinu = pj_sinu(Q->sinu); Q->moll = pj_moll(Q->moll); if (Q->sinu == nullptr || Q->moll == nullptr) - return destructor (P, ENOMEM); + return destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->fwd = goode_s_forward; P->inv = goode_s_inverse; diff --git a/src/projections/gstmerc.cpp b/src/projections/gstmerc.cpp index b21f6ffd..8957d05d 100644 --- a/src/projections/gstmerc.cpp +++ b/src/projections/gstmerc.cpp @@ -56,7 +56,7 @@ static PJ_LP gstmerc_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inve PJ *PROJECTION(gstmerc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->lamc = P->lam0; diff --git a/src/projections/hammer.cpp b/src/projections/hammer.cpp index d9bcafc7..5a183082 100644 --- a/src/projections/hammer.cpp +++ b/src/projections/hammer.cpp @@ -28,7 +28,7 @@ static PJ_XY hammer_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwa lp.lam *= Q->w; double denom = 1. + cosphi * cos(lp.lam); if( denom == 0.0 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } d = sqrt(2./denom); @@ -47,7 +47,7 @@ static PJ_LP hammer_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver if (fabs(2.*z*z-1.) < EPS) { lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; - proj_errno_set(P, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); } else { lp.lam = aatan2(Q->w * xy.x * z,2. * z * z - 1)/Q->w; lp.phi = aasin(P->ctx,z * xy.y); @@ -59,19 +59,25 @@ static PJ_LP hammer_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver PJ *PROJECTION(hammer) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if (pj_param(P->ctx, P->params, "tW").i) { Q->w = fabs(pj_param(P->ctx, P->params, "dW").f); if (Q->w <= 0.) - return pj_default_destructor (P, PJD_ERR_W_OR_M_ZERO_OR_LESS); + { + proj_log_error(P, _("Invalid value for W: it should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } else Q->w = .5; if (pj_param(P->ctx, P->params, "tM").i) { Q->m = fabs(pj_param(P->ctx, P->params, "dM").f); if (Q->m <= 0.) - return pj_default_destructor (P, PJD_ERR_W_OR_M_ZERO_OR_LESS); + { + proj_log_error(P, _("Invalid value for M: it should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } else Q->m = 1.; diff --git a/src/projections/hatano.cpp b/src/projections/hatano.cpp index c10c4e35..4897435f 100644 --- a/src/projections/hatano.cpp +++ b/src/projections/hatano.cpp @@ -47,7 +47,7 @@ static PJ_LP hatano_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver th = xy.y * ( xy.y < 0. ? RYCS : RYCN); if (fabs(th) > 1.) { if (fabs(th) > ONETOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { th = th > 0. ? M_HALFPI : - M_HALFPI; @@ -61,7 +61,7 @@ static PJ_LP hatano_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver lp.phi = (th + sin(th)) * (xy.y < 0. ? RCS : RCN); if (fabs(lp.phi) > 1.) { if (fabs(lp.phi) > ONETOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { lp.phi = lp.phi > 0. ? M_HALFPI : - M_HALFPI; diff --git a/src/projections/healpix.cpp b/src/projections/healpix.cpp index c778f28f..b6863fad 100644 --- a/src/projections/healpix.cpp +++ b/src/projections/healpix.cpp @@ -524,7 +524,7 @@ static PJ_LP s_healpix_inverse(PJ_XY xy, PJ *P) { /* sphere */ PJ_LP lp; lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; - proj_context_errno_set(P->ctx, PJD_ERR_INVALID_X_OR_Y); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } return healpix_spherhealpix_e_inverse(xy); @@ -540,7 +540,7 @@ static PJ_LP e_healpix_inverse(PJ_XY xy, PJ *P) { /* ellipsoid */ if (in_image(xy.x, xy.y, 0, 0, 0) == 0) { lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; - proj_context_errno_set(P->ctx, PJD_ERR_INVALID_X_OR_Y); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } lp = healpix_spherhealpix_e_inverse(xy); @@ -574,7 +574,7 @@ static PJ_LP s_rhealpix_inverse(PJ_XY xy, PJ *P) { /* sphere */ PJ_LP lp; lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; - proj_context_errno_set(P->ctx, PJD_ERR_INVALID_X_OR_Y); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } xy = combine_caps(xy.x, xy.y, Q->north_square, Q->south_square, 1); @@ -590,7 +590,7 @@ static PJ_LP e_rhealpix_inverse(PJ_XY xy, PJ *P) { /* ellipsoid */ if (in_image(xy.x, xy.y, 1, Q->north_square, Q->south_square) == 0) { lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; - proj_context_errno_set(P->ctx, PJD_ERR_INVALID_X_OR_Y); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } xy = combine_caps(xy.x, xy.y, Q->north_square, Q->south_square, 1); @@ -615,7 +615,7 @@ static PJ *destructor (PJ *P, int errlev) { /* Destructor PJ *PROJECTION(healpix) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -625,7 +625,7 @@ PJ *PROJECTION(healpix) { if (P->es != 0.0) { Q->apa = pj_authset(P->es); /* For auth_lat(). */ if (nullptr==Q->apa) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->qp = pj_qsfn(1.0, P->e, P->one_es); /* For auth_lat(). */ P->a = P->a*sqrt(0.5*Q->qp); /* Set P->a to authalic radius. */ pj_calc_ellipsoid_params (P, P->a, P->es); /* Ensure we have a consistent parameter set */ @@ -643,7 +643,7 @@ PJ *PROJECTION(healpix) { PJ *PROJECTION(rhealpix) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -652,13 +652,19 @@ PJ *PROJECTION(rhealpix) { /* Check for valid north_square and south_square inputs. */ if (Q->north_square < 0 || Q->north_square > 3) - return destructor (P, PJD_ERR_AXIS); + { + proj_log_error(P, _("Invalid value for north_square: it should be in [0,3] range.")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (Q->south_square < 0 || Q->south_square > 3) - return destructor (P, PJD_ERR_AXIS); + { + proj_log_error(P, _("Invalid value for south_square: it should be in [0,3] range.")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (P->es != 0.0) { Q->apa = pj_authset(P->es); /* For auth_lat(). */ if (nullptr==Q->apa) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->qp = pj_qsfn(1.0, P->e, P->one_es); /* For auth_lat(). */ P->a = P->a*sqrt(0.5*Q->qp); /* Set P->a to authalic radius. */ P->ra = 1.0/P->a; diff --git a/src/projections/igh.cpp b/src/projections/igh.cpp index 8aaaaba1..9e51addf 100644 --- a/src/projections/igh.cpp +++ b/src/projections/igh.cpp @@ -210,7 +210,7 @@ PJ *PROJECTION(igh) { PJ_LP lp = { 0, phi_boundary }; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; @@ -222,7 +222,7 @@ PJ *PROJECTION(igh) { !setup_zone(P, Q, 7, pj_sinu, d20, 0, d20) || !setup_zone(P, Q, 8, pj_sinu, d140, 0, d140)) { - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } /* mollweide zones */ @@ -243,7 +243,7 @@ PJ *PROJECTION(igh) { !setup_zone(P, Q,11, pj_moll, d20, -Q->dy0, d20) || !setup_zone(P, Q,12, pj_moll, d140, -Q->dy0, d140)) { - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } P->inv = igh_s_inverse; diff --git a/src/projections/igh_o.cpp b/src/projections/igh_o.cpp index 80874845..1a7485e1 100644 --- a/src/projections/igh_o.cpp +++ b/src/projections/igh_o.cpp @@ -224,7 +224,7 @@ PJ *PROJECTION(igh_o) { PJ_LP lp = { 0, phi_boundary }; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; @@ -236,13 +236,13 @@ PJ *PROJECTION(igh_o) { !setup_zone(P, Q, 8, pj_sinu, d20, 0, d20) || !setup_zone(P, Q, 9, pj_sinu, d150, 0, d150)) { - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } /* mollweide zones */ if (!setup_zone(P, Q, 1, pj_moll, -d140, 0, -d140)) { - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } /* y0 ? */ @@ -260,7 +260,7 @@ PJ *PROJECTION(igh_o) { !setup_zone(P, Q, 11, pj_moll, d20, -Q->dy0, d20) || !setup_zone(P, Q, 12, pj_moll, d150, -Q->dy0, d150)) { - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } P->inv = igh_o_s_inverse; diff --git a/src/projections/imw_p.cpp b/src/projections/imw_p.cpp index 6e82d287..6f0bfe5f 100644 --- a/src/projections/imw_p.cpp +++ b/src/projections/imw_p.cpp @@ -34,15 +34,27 @@ static int phi12(PJ *P, double *del, double *sig) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque); int err = 0; - if (!pj_param(P->ctx, P->params, "tlat_1").i || - !pj_param(P->ctx, P->params, "tlat_2").i) { - err = PJD_ERR_LAT_1_2_UNSPECIFIED; - } else { + if (!pj_param(P->ctx, P->params, "tlat_1").i ) + { + proj_log_error(P, _("Missing parameter: lat_1 should be specified")); + err = PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; + } + else if ( !pj_param(P->ctx, P->params, "tlat_2").i) + { + proj_log_error(P, _("Missing parameter: lat_2 should be specified")); + err = PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; + } + else + { Q->phi_1 = pj_param(P->ctx, P->params, "rlat_1").f; Q->phi_2 = pj_param(P->ctx, P->params, "rlat_2").f; *del = 0.5 * (Q->phi_2 - Q->phi_1); *sig = 0.5 * (Q->phi_2 + Q->phi_1); - err = (fabs(*del) < EPS || fabs(*sig) < EPS) ? PJD_ERR_ABS_LAT1_EQ_ABS_LAT2 : 0; + err = (fabs(*del) < EPS || fabs(*sig) < EPS) ? PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE : 0; + if( err ) + { + proj_log_error(P, _("Illegal value for lat_1 and lat_2: |lat_1 - lat_2| and |lat_1 + lat_2| should be > 0")); + } } return err; } @@ -120,7 +132,7 @@ static PJ_LP imw_p_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, invers if( denom != 0 || fabs(t.y - xy.y) > TOL ) { if( denom == 0 ) { - proj_errno_set(P, PJD_ERR_NON_CONVERGENT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } lp.phi = ((lp.phi - Q->phi_1) * (xy.y - yc) / denom) + Q->phi_1; @@ -133,7 +145,7 @@ static PJ_LP imw_p_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, invers if( i == N_MAX_ITER ) { - proj_errno_set(P, PJD_ERR_NON_CONVERGENT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } @@ -171,10 +183,10 @@ PJ *PROJECTION(imw_p) { int err; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; - if (!(Q->en = pj_enfn(P->es))) return pj_default_destructor (P, ENOMEM); + if (!(Q->en = pj_enfn(P->es))) return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); if( (err = phi12(P, &del, &sig)) != 0) { return destructor(P, err); } diff --git a/src/projections/isea.cpp b/src/projections/isea.cpp index 77a5689b..7a782f3d 100644 --- a/src/projections/isea.cpp +++ b/src/projections/isea.cpp @@ -1026,7 +1026,7 @@ static PJ_XY isea_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward try { out = isea_forward(&Q->dgg, &in); } catch( const char* ) { - proj_errno_set(P, PJD_ERR_NON_CONVERGENT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } @@ -1041,7 +1041,7 @@ PJ *PROJECTION(isea) { char *opt; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; @@ -1059,7 +1059,8 @@ PJ *PROJECTION(isea) { } else if (!strcmp(opt, "pole")) { isea_orient_pole(&Q->dgg); } else { - return pj_default_destructor(P, PJD_ERR_ELLIPSOID_USE_REQUIRED); + proj_log_error(P, _("Invalid value for orient: only isea or pole are supported")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } @@ -1089,8 +1090,8 @@ PJ *PROJECTION(isea) { Q->dgg.output = ISEA_HEX; } else { - /* TODO verify error code. Possibly eliminate magic */ - return pj_default_destructor(P, PJD_ERR_ELLIPSOID_USE_REQUIRED); + proj_log_error(P, _("Invalid value for mode: only plane, di, dd or hex are supported")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } diff --git a/src/projections/krovak.cpp b/src/projections/krovak.cpp index adc039fe..2afe3672 100644 --- a/src/projections/krovak.cpp +++ b/src/projections/krovak.cpp @@ -181,7 +181,7 @@ static PJ_LP krovak_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, fi1 = lp.phi; } if( i == 0 ) - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); lp.lam -= P->lam0; @@ -193,7 +193,7 @@ PJ *PROJECTION(krovak) { double u0, n0, g; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; /* we want Bessel as fixed ellipsoid */ @@ -225,7 +225,8 @@ PJ *PROJECTION(krovak) { g = pow( (1. + P->e * sin(P->phi0)) / (1. - P->e * sin(P->phi0)) , Q->alpha * P->e / 2. ); double tan_half_phi0_plus_pi_4 = tan(P->phi0 / 2. + M_PI_4); if( tan_half_phi0_plus_pi_4 == 0.0 ) { - return pj_default_destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("Invalid value for lat_0: lat_0 + PI/4 should be different from 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->k = tan( u0 / 2. + M_PI_4) / pow (tan_half_phi0_plus_pi_4 , Q->alpha) * g; n0 = sqrt(1. - P->es) / (1. - P->es * pow(sin(P->phi0), 2)); diff --git a/src/projections/labrd.cpp b/src/projections/labrd.cpp index 4fbcf460..b17e71e9 100644 --- a/src/projections/labrd.cpp +++ b/src/projections/labrd.cpp @@ -107,11 +107,12 @@ PJ *PROJECTION(labrd) { double Az, sinp, R, N, t; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if (P->phi0 == 0.) { - return pj_default_destructor(P, PJD_ERR_LAT_0_IS_ZERO); + proj_log_error(P, _("Invalid value for lat_0: lat_0 should be different from 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Az = pj_param(P->ctx, P->params, "razi").f; diff --git a/src/projections/laea.cpp b/src/projections/laea.cpp index 2d19cab1..5054e8ff 100644 --- a/src/projections/laea.cpp +++ b/src/projections/laea.cpp @@ -65,7 +65,7 @@ static PJ_XY laea_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward break; } if (fabs(b) < EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } @@ -111,7 +111,7 @@ static PJ_XY laea_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward xy.y = 1. + Q->sinb1 * sinphi + Q->cosb1 * cosphi * coslam; oblcon: if (xy.y <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.y = sqrt(2. / xy.y); @@ -124,7 +124,7 @@ oblcon: /*-fallthrough*/ case S_POLE: if (fabs(lp.phi + P->phi0) < EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.y = M_FORTPI - lp.phi * .5; @@ -193,7 +193,7 @@ static PJ_LP laea_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse rh = hypot(xy.x, xy.y); if ((lp.phi = rh * .5 ) > 1.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } lp.phi = 2. * asin(lp.phi); @@ -244,13 +244,14 @@ PJ *PROJECTION(laea) { double t; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; t = fabs(P->phi0); if (t > M_HALFPI + EPS10 ) { - return destructor(P, PJD_ERR_LAT_LARGER_THAN_90); + proj_log_error(P, _("Invalid value for lat_0: |lat_0| should be <= 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } if (fabs(t - M_HALFPI) < EPS10) Q->mode = P->phi0 < 0. ? S_POLE : N_POLE; @@ -266,7 +267,7 @@ PJ *PROJECTION(laea) { Q->mmf = .5 / (1. - P->es); Q->apa = pj_authset(P->es); if (nullptr==Q->apa) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); switch (Q->mode) { case N_POLE: case S_POLE: diff --git a/src/projections/lagrng.cpp b/src/projections/lagrng.cpp index 1029bf8d..fa680643 100644 --- a/src/projections/lagrng.cpp +++ b/src/projections/lagrng.cpp @@ -35,7 +35,7 @@ static PJ_XY lagrng_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwa lp.lam *= Q->rw; c = 0.5 * (v + 1./v) + cos(lp.lam); if (c < TOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.x = 2. * sin(lp.lam) / c; @@ -59,7 +59,7 @@ static PJ_LP lagrng_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver y2m = 2. - xy.y; c = y2p * y2m - x2; if (fabs(c) < TOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } lp.phi = 2. * atan(pow((y2p * y2p + x2) / (Q->a2 * (y2m * y2m + x2)), Q->hw)) - M_HALFPI; @@ -73,7 +73,7 @@ PJ *PROJECTION(lagrng) { double sin_phi1; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if( pj_param(P->ctx, P->params, "tW").i ) @@ -81,13 +81,19 @@ PJ *PROJECTION(lagrng) { else Q->w = 2; if (Q->w <= 0) - return pj_default_destructor(P, PJD_ERR_W_OR_M_ZERO_OR_LESS); + { + proj_log_error(P, _("Invalid value for W: it should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->hw = 0.5 * Q->w; Q->rw = 1. / Q->w; Q->hrw = 0.5 * Q->rw; sin_phi1 = sin(pj_param(P->ctx, P->params, "rlat_1").f); if (fabs(fabs(sin_phi1) - 1.) < TOL) - return pj_default_destructor(P, PJD_ERR_LAT_LARGER_THAN_90); + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->a1 = pow((1. - sin_phi1)/(1. + sin_phi1), Q->hrw); Q->a2 = Q->a1 * Q->a1; diff --git a/src/projections/lcc.cpp b/src/projections/lcc.cpp index 525281f4..42d8b2c9 100644 --- a/src/projections/lcc.cpp +++ b/src/projections/lcc.cpp @@ -27,7 +27,7 @@ static PJ_XY lcc_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward if (fabs(fabs(lp.phi) - M_HALFPI) < EPS10) { if ((lp.phi * Q->n) <= 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } rho = 0.; @@ -62,7 +62,7 @@ static PJ_LP lcc_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse if (P->es != 0.) { lp.phi = pj_phi2(P->ctx, pow(rho / Q->c, 1./Q->n), P->e); if (lp.phi == HUGE_VAL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } @@ -83,7 +83,7 @@ PJ *PROJECTION(lcc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc(1, sizeof (struct pj_opaque))); if (nullptr == Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f; @@ -94,37 +94,45 @@ PJ *PROJECTION(lcc) { if (!pj_param(P->ctx, P->params, "tlat_0").i) P->phi0 = Q->phi1; } - if (fabs(Q->phi1) > M_HALFPI || fabs(Q->phi2) > M_HALFPI) - return pj_default_destructor(P, PJD_ERR_LAT_LARGER_THAN_90); + if (fabs(Q->phi1 + Q->phi2) < EPS10) - return pj_default_destructor(P, PJD_ERR_CONIC_LAT_EQUAL); + { + proj_log_error(P, _("Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->n = sinphi = sin(Q->phi1); cosphi = cos(Q->phi1); + + if( fabs(cosphi) < EPS10 || fabs(Q->phi1) >= M_PI_2 ) { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if( fabs(cos(Q->phi2)) < EPS10 || fabs(Q->phi2) >= M_PI_2 ) { + proj_log_error(P, _("Invalid value for lat_2: |lat_2| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + secant = fabs(Q->phi1 - Q->phi2) >= EPS10; if (P->es != 0.) { double ml1, m1; m1 = pj_msfn(sinphi, cosphi, P->es); - if( fabs(Q->phi1) == M_HALFPI ) { - return pj_default_destructor(P, PJD_ERR_LAT_1_OR_2_ZERO_OR_90); - } ml1 = pj_tsfn(Q->phi1, sinphi, P->e); if (secant) { /* secant cone */ sinphi = sin(Q->phi2); Q->n = log(m1 / pj_msfn(sinphi, cos(Q->phi2), P->es)); if (Q->n == 0) { // Not quite, but es is very close to 1... - return pj_default_destructor(P, PJD_ERR_INVALID_ECCENTRICITY); - } - if( fabs(Q->phi2) == M_HALFPI ) { - return pj_default_destructor(P, PJD_ERR_LAT_1_OR_2_ZERO_OR_90); + proj_log_error(P, _("Invalid value for eccentricity")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } const double ml2 = pj_tsfn(Q->phi2, sinphi, P->e); const double denom = log(ml1 / ml2); if( denom == 0 ) { // Not quite, but es is very close to 1... - return pj_default_destructor(P, PJD_ERR_INVALID_ECCENTRICITY); + proj_log_error(P, _("Invalid value for eccentricity")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->n /= denom; } @@ -133,9 +141,6 @@ PJ *PROJECTION(lcc) { Q->rho0 *= (fabs(fabs(P->phi0) - M_HALFPI) < EPS10) ? 0. : pow(pj_tsfn(P->phi0, sin(P->phi0), P->e), Q->n); } else { - if( fabs(cosphi) < EPS10 || fabs(cos(Q->phi2)) < EPS10 ) { - return pj_default_destructor(P, PJD_ERR_LAT_1_OR_2_ZERO_OR_90); - } if (secant) Q->n = log(cosphi / cos(Q->phi2)) / log(tan(M_FORTPI + .5 * Q->phi2) / @@ -143,7 +148,8 @@ PJ *PROJECTION(lcc) { if( Q->n == 0 ) { // Likely reason is that phi1 / phi2 are too close to zero. // Can be reproduced with +proj=lcc +a=1 +lat_2=.0000001 - return pj_default_destructor(P, PJD_ERR_CONIC_LAT_EQUAL); + proj_log_error(P, _("Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->c = cosphi * pow(tan(M_FORTPI + .5 * Q->phi1), Q->n) / Q->n; Q->rho0 = (fabs(fabs(P->phi0) - M_HALFPI) < EPS10) ? 0. : diff --git a/src/projections/lcca.cpp b/src/projections/lcca.cpp index 53646fc6..6f962699 100644 --- a/src/projections/lcca.cpp +++ b/src/projections/lcca.cpp @@ -112,7 +112,7 @@ static PJ_LP lcca_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse if (fabs(dif) < DEL_TOL) break; } if (!i) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } lp.phi = pj_inv_mlfn(P->ctx, S + Q->M0, P->es, Q->en); @@ -137,15 +137,16 @@ PJ *PROJECTION(lcca) { double s2p0, N0, R0, tan0; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; (Q->en = pj_enfn(P->es)); if (!Q->en) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); if (P->phi0 == 0.) { - return destructor(P, PJD_ERR_LAT_0_IS_ZERO); + proj_log_error(P, _("Invalid value for lat_0: it should be different from 0.")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->l = sin(P->phi0); Q->M0 = pj_mlfn(P->phi0, Q->l, cos(P->phi0), Q->en); diff --git a/src/projections/loxim.cpp b/src/projections/loxim.cpp index 64124bdd..e0b62f1b 100644 --- a/src/projections/loxim.cpp +++ b/src/projections/loxim.cpp @@ -58,14 +58,16 @@ static PJ_LP loxim_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers PJ *PROJECTION(loxim) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f; Q->cosphi1 = cos(Q->phi1); if (Q->cosphi1 < EPS) - return pj_default_destructor(P, PJD_ERR_LAT_LARGER_THAN_90); - + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->tanphi1 = tan(M_FORTPI + 0.5 * Q->phi1); diff --git a/src/projections/lsat.cpp b/src/projections/lsat.cpp index a811a3a6..ad056da5 100644 --- a/src/projections/lsat.cpp +++ b/src/projections/lsat.cpp @@ -136,7 +136,7 @@ static PJ_LP lsat_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse sppsq = spp * spp; const double denom = 1. - sppsq * (1. + Q->u); if( denom == 0.0 ) { - proj_errno_set(P, PJD_ERR_INVALID_X_OR_Y); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } lamt = atan(((1. - sppsq * P->rone_es) * tan(lamdp) * @@ -160,16 +160,23 @@ PJ *PROJECTION(lsat) { double lam, alf, esc, ess; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; land = pj_param(P->ctx, P->params, "ilsat").i; if (land <= 0 || land > 5) - return pj_default_destructor(P, PJD_ERR_LSAT_NOT_IN_RANGE); + { + proj_log_error(P, _("Invalid value for lsat: lsat should be in [1, 5] range")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } path = pj_param(P->ctx, P->params, "ipath").i; - if (path <= 0 || path > (land <= 3 ? 251 : 233)) - return pj_default_destructor(P, PJD_ERR_PATH_NOT_IN_RANGE); + const int maxPathVal = (land <= 3 ? 251 : 233); + if (path <= 0 || path > maxPathVal) + { + proj_log_error(P, _("Invalid value for path: path should be in [1, %d] range"), maxPathVal); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (land <= 3) { P->lam0 = DEG_TO_RAD * 128.87 - M_TWOPI / 251. * path; diff --git a/src/projections/mbtfpp.cpp b/src/projections/mbtfpp.cpp index cc01cb40..bfa869f9 100644 --- a/src/projections/mbtfpp.cpp +++ b/src/projections/mbtfpp.cpp @@ -32,7 +32,7 @@ static PJ_LP mbtfpp_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver lp.phi = xy.y / FYC; if (fabs(lp.phi) >= 1.) { if (fabs(lp.phi) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { lp.phi = (lp.phi < 0.) ? -M_HALFPI : M_HALFPI; @@ -45,7 +45,7 @@ static PJ_LP mbtfpp_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver lp.phi = sin(lp.phi) / CSy; if (fabs(lp.phi) >= 1.) { if (fabs(lp.phi) > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { lp.phi = (lp.phi < 0.) ? -M_HALFPI : M_HALFPI; diff --git a/src/projections/mbtfpq.cpp b/src/projections/mbtfpq.cpp index 5c7f8ca6..7d44b5ba 100644 --- a/src/projections/mbtfpq.cpp +++ b/src/projections/mbtfpq.cpp @@ -42,7 +42,7 @@ static PJ_LP mbtfpq_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver lp.phi = RYC * xy.y; if (fabs(lp.phi) > 1.) { if (fabs(lp.phi) > ONETOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else if (lp.phi < 0.) { @@ -61,7 +61,7 @@ static PJ_LP mbtfpq_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver lp.phi = RC * (t + sin(lp.phi)); if (fabs(lp.phi) > 1.) if (fabs(lp.phi) > ONETOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else lp.phi = lp.phi < 0. ? -M_HALFPI : M_HALFPI; diff --git a/src/projections/merc.cpp b/src/projections/merc.cpp index 3a0ed7b4..7fd3dff9 100644 --- a/src/projections/merc.cpp +++ b/src/projections/merc.cpp @@ -53,7 +53,10 @@ PJ *PROJECTION(merc) { if( (is_phits = pj_param(P->ctx, P->params, "tlat_ts").i) ) { phits = fabs(pj_param(P->ctx, P->params, "rlat_ts").f); if (phits >= M_HALFPI) - return pj_default_destructor(P, PJD_ERR_LAT_TS_LARGER_THAN_90); + { + proj_log_error(P, _("Invalid value for lat_ts: |lat_ts| should be <= 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } if (P->es != 0.0) { /* ellipsoid */ diff --git a/src/projections/misrsom.cpp b/src/projections/misrsom.cpp index d7e199f2..23376789 100644 --- a/src/projections/misrsom.cpp +++ b/src/projections/misrsom.cpp @@ -155,7 +155,7 @@ static PJ_LP misrsom_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inve sppsq = spp * spp; const double denom = 1. - sppsq * (1. + Q->u); if( denom == 0.0 ) { - proj_errno_set(P, PJD_ERR_NON_CONVERGENT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } lamt = atan(((1. - sppsq * P->rone_es) * tan(lamdp) * @@ -180,12 +180,15 @@ PJ *PROJECTION(misrsom) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; path = pj_param(P->ctx, P->params, "ipath").i; if (path <= 0 || path > 233) - return pj_default_destructor(P, PJD_ERR_PATH_NOT_IN_RANGE); + { + proj_log_error(P, _("Invalid value for path: path should be in [1, 233] range")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } P->lam0 = DEG_TO_RAD * 129.3056 - M_TWOPI / 233. * path; alf = 98.30382 * DEG_TO_RAD; diff --git a/src/projections/mod_ster.cpp b/src/projections/mod_ster.cpp index 0c30b7b6..237ff75a 100644 --- a/src/projections/mod_ster.cpp +++ b/src/projections/mod_ster.cpp @@ -37,7 +37,7 @@ static PJ_XY mod_ster_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, for cchi = cos(chi); const double denom = 1. + Q->schio * schi + Q->cchio * cchi * coslon; if( denom == 0 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } s = 2. / denom; @@ -136,7 +136,7 @@ PJ *PROJECTION(mil_os) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->n = 2; @@ -159,7 +159,7 @@ PJ *PROJECTION(lee_os) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->n = 2; @@ -184,7 +184,7 @@ PJ *PROJECTION(gs48) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->n = 4; @@ -219,7 +219,7 @@ PJ *PROJECTION(alsk) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->n = 5; @@ -267,7 +267,7 @@ PJ *PROJECTION(gs50) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->n = 9; diff --git a/src/projections/moll.cpp b/src/projections/moll.cpp index 4864c8e1..523de210 100644 --- a/src/projections/moll.cpp +++ b/src/projections/moll.cpp @@ -79,7 +79,7 @@ static PJ * setup(PJ *P, double p) { PJ *PROJECTION(moll) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; return setup(P, M_HALFPI); @@ -89,7 +89,7 @@ PJ *PROJECTION(moll) { PJ *PROJECTION(wag4) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; return setup(P, M_PI/3.); @@ -98,7 +98,7 @@ PJ *PROJECTION(wag4) { PJ *PROJECTION(wag5) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->es = 0; diff --git a/src/projections/natearth.cpp b/src/projections/natearth.cpp index e1f71089..f83c8467 100644 --- a/src/projections/natearth.cpp +++ b/src/projections/natearth.cpp @@ -82,7 +82,7 @@ static PJ_LP natearth_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inv } } if( i == 0 ) - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); lp.phi = yc; /* longitude */ diff --git a/src/projections/natearth2.cpp b/src/projections/natearth2.cpp index e4516a0a..8bef168d 100644 --- a/src/projections/natearth2.cpp +++ b/src/projections/natearth2.cpp @@ -76,7 +76,7 @@ static PJ_LP natearth2_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, in } } if( i == 0 ) - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); lp.phi = yc; /* longitude */ diff --git a/src/projections/nsper.cpp b/src/projections/nsper.cpp index 951111ac..5f76d9b0 100644 --- a/src/projections/nsper.cpp +++ b/src/projections/nsper.cpp @@ -66,7 +66,7 @@ static PJ_XY nsper_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar break; } if (xy.y < Q->rp) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.y = Q->pn1 / (Q->p - xy.y); @@ -120,7 +120,7 @@ static PJ_LP nsper_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers double cosz, sinz; sinz = 1. - rh * rh * Q->pfact; if (sinz < 0.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } sinz = (Q->p - sqrt(sinz)) / (Q->pn1 / rh + rh / Q->pn1); @@ -166,7 +166,10 @@ static PJ *setup(PJ *P) { } Q->pn1 = Q->height / P->a; /* normalize by radius */ if ( Q->pn1 <= 0 || Q->pn1 > 1e10 ) - return pj_default_destructor (P, PJD_ERR_INVALID_H); + { + proj_log_error(P, _("Invalid value for h")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->p = 1. + Q->pn1; Q->rp = 1. / Q->p; Q->h = 1. / Q->pn1; @@ -182,7 +185,7 @@ static PJ *setup(PJ *P) { PJ *PROJECTION(nsper) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->tilt = 0; @@ -196,7 +199,7 @@ PJ *PROJECTION(tpers) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; omega = pj_param(P->ctx, P->params, "rtilt").f; diff --git a/src/projections/ob_tran.cpp b/src/projections/ob_tran.cpp index 86798e0a..abab5835 100644 --- a/src/projections/ob_tran.cpp +++ b/src/projections/ob_tran.cpp @@ -180,26 +180,33 @@ PJ *PROJECTION(ob_tran) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; /* get name of projection to be translated */ if (pj_param(P->ctx, P->params, "so_proj").s == nullptr) - return destructor(P, PJD_ERR_NO_ROTATION_PROJ); + { + proj_log_error(P, _("Missing parameter: o_proj")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } /* Create the target projection object to rotate */ args = ob_tran_target_params (P->params); /* avoid endless recursion */ if (args.argv == nullptr ) { - return destructor(P, PJD_ERR_FAILED_TO_FIND_PROJ); + proj_log_error(P, _("Failed to find projection to be rotated")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } R = proj_create_argv (P->ctx, args.argc, args.argv); free (args.argv); if (nullptr==R) - return destructor (P, PJD_ERR_UNKNOWN_PROJECTION_ID); + { + proj_log_error(P, _("Projection to be rotated is unknown")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->link = R; if (pj_param(P->ctx, P->params, "to_alpha").i) { @@ -210,7 +217,10 @@ PJ *PROJECTION(ob_tran) { alpha = pj_param(P->ctx, P->params, "ro_alpha").f; if (fabs(fabs(phic) - M_HALFPI) <= TOL) - return destructor(P, PJD_ERR_LAT_0_OR_ALPHA_EQ_90); + { + proj_log_error(P, _("Invalid value for lat_c: |lat_c| should be < 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->lamp = lamc + aatan2(-cos(alpha), -sin(alpha) * sin(phic)); phip = aasin(P->ctx,cos(phic) * sin(alpha)); @@ -225,9 +235,27 @@ PJ *PROJECTION(ob_tran) { lam2 = pj_param(P->ctx, P->params, "ro_lon_2").f; phi2 = pj_param(P->ctx, P->params, "ro_lat_2").f; con = fabs(phi1); - if (fabs(phi1 - phi2) <= TOL || con <= TOL || - fabs(con - M_HALFPI) <= TOL || fabs(fabs(phi2) - M_HALFPI) <= TOL) - return destructor(P, PJD_ERR_LAT_1_OR_2_ZERO_OR_90); + + if (fabs(phi1) > M_HALFPI - TOL) + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be < 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if (fabs(phi2) > M_HALFPI - TOL) + { + proj_log_error(P, _("Invalid value for lat_2: |lat_2| should be < 90°")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if (fabs(phi1 - phi2) < TOL) + { + proj_log_error(P, _("Invalid value for lat_1 and lat_2: lat_1 should be different from lat_2")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if (con < TOL) + { + proj_log_error(P, _("Invalid value for lat_1: lat_1 should be different from zero")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->lamp = atan2(cos(phi1) * sin(phi2) * cos(lam1) - sin(phi1) * cos(phi2) * cos(lam2), diff --git a/src/projections/ocea.cpp b/src/projections/ocea.cpp index c78e1ebc..febebcc0 100644 --- a/src/projections/ocea.cpp +++ b/src/projections/ocea.cpp @@ -54,7 +54,7 @@ PJ *PROJECTION(ocea) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->rok = 1. / P->k0; diff --git a/src/projections/oea.cpp b/src/projections/oea.cpp index 46c00d16..2d16d529 100644 --- a/src/projections/oea.cpp +++ b/src/projections/oea.cpp @@ -60,27 +60,34 @@ static PJ_LP oea_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse PJ *PROJECTION(oea) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; - if (((Q->n = pj_param(P->ctx, P->params, "dn").f) <= 0.) || - ((Q->m = pj_param(P->ctx, P->params, "dm").f) <= 0.)) { - return pj_default_destructor(P, PJD_ERR_INVALID_M_OR_N); - } else { - Q->theta = pj_param(P->ctx, P->params, "rtheta").f; - Q->sp0 = sin(P->phi0); - Q->cp0 = cos(P->phi0); - Q->rn = 1./ Q->n; - Q->rm = 1./ Q->m; - Q->two_r_n = 2. * Q->rn; - Q->two_r_m = 2. * Q->rm; - Q->hm = 0.5 * Q->m; - Q->hn = 0.5 * Q->n; - P->fwd = oea_s_forward; - P->inv = oea_s_inverse; - P->es = 0.; + if (((Q->n = pj_param(P->ctx, P->params, "dn").f) <= 0.) ) + { + proj_log_error(P, _("Invalid value for n: it should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } + if (((Q->m = pj_param(P->ctx, P->params, "dm").f) <= 0.) ) + { + proj_log_error(P, _("Invalid value for m: it should be > 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + + Q->theta = pj_param(P->ctx, P->params, "rtheta").f; + Q->sp0 = sin(P->phi0); + Q->cp0 = cos(P->phi0); + Q->rn = 1./ Q->n; + Q->rm = 1./ Q->m; + Q->two_r_n = 2. * Q->rn; + Q->two_r_m = 2. * Q->rm; + Q->hm = 0.5 * Q->m; + Q->hn = 0.5 * Q->n; + P->fwd = oea_s_forward; + P->inv = oea_s_inverse; + P->es = 0.; + return P; } diff --git a/src/projections/omerc.cpp b/src/projections/omerc.cpp index 90067cc3..88d63809 100644 --- a/src/projections/omerc.cpp +++ b/src/projections/omerc.cpp @@ -58,7 +58,7 @@ static PJ_XY omerc_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forwar const double V = sin(Q->B * lp.lam); const double U = (S * Q->singam - V * Q->cosgam) / T; if (fabs(fabs(U) - 1.0) < EPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } v = 0.5 * Q->ArB * log((1. - U)/(1. + U)); @@ -98,7 +98,7 @@ static PJ_LP omerc_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, invers } Qp = exp(- Q->BrA * v); if( Qp == 0 ) { - proj_errno_set(P, PJD_ERR_INVALID_X_OR_Y); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } Sp = .5 * (Qp - 1. / Qp); @@ -111,7 +111,7 @@ static PJ_LP omerc_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, invers } else { lp.phi = Q->E / sqrt((1. + Up) / (1. - Up)); if ((lp.phi = pj_phi2(P->ctx, pow(lp.phi, 1. / Q->B), P->e)) == HUGE_VAL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } lp.lam = - Q->rB * atan2((Sp * Q->cosgam - @@ -128,7 +128,7 @@ PJ *PROJECTION(omerc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->no_rot = pj_param(P->ctx, P->params, "bno_rot").i; @@ -154,14 +154,36 @@ PJ *PROJECTION(omerc) { phi1 = pj_param(P->ctx, P->params, "rlat_1").f; lam2 = pj_param(P->ctx, P->params, "rlon_2").f; phi2 = pj_param(P->ctx, P->params, "rlat_2").f; - if (fabs(phi1) > M_HALFPI || fabs(phi2) > M_HALFPI) - return pj_default_destructor(P, PJD_ERR_LAT_LARGER_THAN_90); - if (fabs(phi1 - phi2) <= TOL || - (con = fabs(phi1)) <= TOL || - fabs(con - M_HALFPI) <= TOL || - fabs(fabs(P->phi0) - M_HALFPI) <= TOL || - fabs(fabs(phi2) - M_HALFPI) <= TOL) - return pj_default_destructor(P, PJD_ERR_LAT_0_OR_ALPHA_EQ_90); + con = fabs(phi1); + + if (fabs(phi1) > M_HALFPI - TOL) + { + proj_log_error(P, _("Invalid value for lat_1: |lat_1| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + if (fabs(phi2) > M_HALFPI - TOL) + { + proj_log_error(P, _("Invalid value for lat_2: |lat_2| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + + if (fabs(phi1 - phi2) <= TOL ) + { + proj_log_error(P, _("Invalid value for lat_1/lat_2: lat_1 should be different from lat_2")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + + if (con <= TOL ) + { + proj_log_error(P, _("Invalid value for lat_1: lat_1 should be different from 0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + + if (fabs(fabs(P->phi0) - M_HALFPI) <= TOL) + { + proj_log_error(P, _("Invalid value for lat_01: |lat_0| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } com = sqrt(P->one_es); if (fabs(P->phi0) > EPS) { @@ -193,9 +215,13 @@ PJ *PROJECTION(omerc) { gamma = alpha_c; } else alpha_c = aasin(P->ctx, D*sin(gamma0 = gamma)); - if( fabs(fabs(P->phi0) - M_HALFPI) <= TOL ) { - return pj_default_destructor(P, PJD_ERR_LAT_0_OR_ALPHA_EQ_90); + + if (fabs(fabs(P->phi0) - M_HALFPI) <= TOL) + { + proj_log_error(P, _("Invalid value for lat_01: |lat_0| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } + P->lam0 = lamc - aasin(P->ctx, .5 * (F - 1. / F) * tan(gamma0)) / Q->B; } else { @@ -205,7 +231,8 @@ PJ *PROJECTION(omerc) { p = (L - H) / (L + H); if( p == 0 ) { // Not quite, but es is very close to 1... - return pj_default_destructor(P, PJD_ERR_INVALID_ECCENTRICITY); + proj_log_error(P, _("Invalid value for eccentricity")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } J = Q->E * Q->E; J = (J - L * H) / (J + L * H); @@ -217,7 +244,8 @@ PJ *PROJECTION(omerc) { J * tan(.5 * Q->B * (lam1 - lam2)) / p) / Q->B); const double denom = F - 1. / F; if( denom == 0 ) { - return pj_default_destructor(P, PJD_ERR_INVALID_ECCENTRICITY); + proj_log_error(P, _("Invalid value for eccentricity")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } gamma0 = atan(2. * sin(Q->B * adjlon(lam1 - P->lam0)) / denom); gamma = alpha_c = aasin(P->ctx, D * sin(gamma0)); diff --git a/src/projections/ortho.cpp b/src/projections/ortho.cpp index 4417dac7..206abb69 100644 --- a/src/projections/ortho.cpp +++ b/src/projections/ortho.cpp @@ -29,7 +29,7 @@ struct pj_opaque { #define EPS10 1.e-10 static PJ_XY forward_error(PJ *P, PJ_LP lp, PJ_XY xy) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); proj_log_trace(P, "Coordinate (%.3f, %.3f) is on the unprojected hemisphere", proj_todeg(lp.lam), proj_todeg(lp.phi)); return xy; @@ -88,7 +88,7 @@ static PJ_LP ortho_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers sinc = rh; if (sinc > 1.) { if ((sinc - 1.) > EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); return lp; } @@ -176,7 +176,7 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver const double rh2 = SQ(xy.x) + SQ(xy.y); if (rh2 >= 1. - 1e-15) { if ((rh2 - 1.) > EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; return lp; @@ -200,7 +200,7 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver // Equation of the ellipse if( SQ(xy.x) + SQ(xy.y * (P->a / P->b)) > 1 + 1e-11 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; return lp; @@ -228,7 +228,7 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver xy_recentered.x = xy.x; xy_recentered.y = (xy.y - Q->y_shift) / Q->y_scale; if( SQ(xy.x) + SQ(xy_recentered.y) > 1 + 1e-11 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); proj_log_trace(P, "Point (%.3f, %.3f) is outside the projection boundary"); lp.lam = HUGE_VAL; lp.phi = HUGE_VAL; return lp; @@ -273,7 +273,7 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver return lp; } } - proj_context_errno_set(P->ctx, PJD_ERR_NON_CONVERGENT); + proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } @@ -281,7 +281,7 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver PJ *PROJECTION(ortho) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->sinph0 = sin(P->phi0); diff --git a/src/projections/patterson.cpp b/src/projections/patterson.cpp index 32544580..d24ee98d 100644 --- a/src/projections/patterson.cpp +++ b/src/projections/patterson.cpp @@ -100,7 +100,7 @@ static PJ_LP patterson_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, in } } if( i == 0 ) - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); lp.phi = yc; /* longitude */ diff --git a/src/projections/poly.cpp b/src/projections/poly.cpp index 4ea95cc7..99b6772e 100644 --- a/src/projections/poly.cpp +++ b/src/projections/poly.cpp @@ -80,7 +80,7 @@ static PJ_LP poly_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse const double cp = cos(lp.phi); const double s2ph = sp * cp; if (fabs(cp) < ITOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } double mlp = sqrt(1. - P->es * sp * sp); @@ -97,7 +97,7 @@ static PJ_LP poly_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse break; } if (!i) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } const double c = sin(lp.phi); @@ -128,7 +128,7 @@ static PJ_LP poly_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse break; --i; if( i == 0 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } } @@ -156,14 +156,14 @@ static PJ *destructor(PJ *P, int errlev) { PJ *PROJECTION(poly) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; if (P->es != 0.0) { if (!(Q->en = pj_enfn(P->es))) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->ml0 = pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), Q->en); P->inv = poly_e_inverse; P->fwd = poly_e_forward; diff --git a/src/projections/putp3.cpp b/src/projections/putp3.cpp index 09763851..3554909e 100644 --- a/src/projections/putp3.cpp +++ b/src/projections/putp3.cpp @@ -40,7 +40,7 @@ static PJ_LP putp3_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers PJ *PROJECTION(putp3) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->A = 4. * RPISQ; @@ -55,7 +55,7 @@ PJ *PROJECTION(putp3) { PJ *PROJECTION(putp3p) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->A = 2. * RPISQ; diff --git a/src/projections/putp4p.cpp b/src/projections/putp4p.cpp index 8df18972..1c9a763e 100644 --- a/src/projections/putp4p.cpp +++ b/src/projections/putp4p.cpp @@ -47,7 +47,7 @@ static PJ_LP putp4p_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inver PJ *PROJECTION(putp4p) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 0.874038744; @@ -64,7 +64,7 @@ PJ *PROJECTION(putp4p) { PJ *PROJECTION(weren) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 1.; diff --git a/src/projections/putp5.cpp b/src/projections/putp5.cpp index 5e70382d..a6aed94e 100644 --- a/src/projections/putp5.cpp +++ b/src/projections/putp5.cpp @@ -45,7 +45,7 @@ static PJ_LP putp5_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers PJ *PROJECTION(putp5) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->A = 2.; @@ -62,7 +62,7 @@ PJ *PROJECTION(putp5) { PJ *PROJECTION(putp5p) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->A = 1.5; diff --git a/src/projections/putp6.cpp b/src/projections/putp6.cpp index da8c0a7c..63253fbd 100644 --- a/src/projections/putp6.cpp +++ b/src/projections/putp6.cpp @@ -61,7 +61,7 @@ static PJ_LP putp6_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers PJ *PROJECTION(putp6) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 1.01346; @@ -81,7 +81,7 @@ PJ *PROJECTION(putp6) { PJ *PROJECTION(putp6p) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->C_x = 0.44329; diff --git a/src/projections/qsc.cpp b/src/projections/qsc.cpp index dd9ce965..920e93b0 100644 --- a/src/projections/qsc.cpp +++ b/src/projections/qsc.cpp @@ -379,7 +379,7 @@ static PJ_LP qsc_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inverse PJ *PROJECTION(qsc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->inv = qsc_e_inverse; diff --git a/src/projections/robin.cpp b/src/projections/robin.cpp index 6a1405b6..4dfc306c 100644 --- a/src/projections/robin.cpp +++ b/src/projections/robin.cpp @@ -86,7 +86,7 @@ static PJ_XY robin_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar dphi = fabs(lp.phi); i = isnan(lp.phi) ? -1 : lround(floor(dphi * C1 + 1e-15)); if( i < 0 ){ - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } if (i >= NODES) i = NODES; @@ -109,7 +109,7 @@ static PJ_LP robin_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers lp.phi = fabs(xy.y / FYC); if (lp.phi >= 1.) { /* simple pathologic cases */ if (lp.phi > ONEEPS) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } else { @@ -120,7 +120,7 @@ static PJ_LP robin_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers /* in Y space, reduce to table interval */ long i = isnan(lp.phi) ? -1 : lround(floor(lp.phi * NODES)); if( i < 0 || i >= NODES ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } for (;;) { @@ -138,12 +138,12 @@ static PJ_LP robin_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers break; } if( iters == 0 ) - proj_context_errno_set( P->ctx, PJD_ERR_NON_CONVERGENT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); lp.phi = (5 * i + t) * DEG_TO_RAD; if (xy.y < 0.) lp.phi = -lp.phi; lp.lam /= V(X[i], t); if( fabs(lp.lam) > M_PI ) { - proj_errno_set(P, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); lp = proj_coord_error().lp; } } diff --git a/src/projections/rouss.cpp b/src/projections/rouss.cpp index 2eb13b3d..195b90b3 100644 --- a/src/projections/rouss.cpp +++ b/src/projections/rouss.cpp @@ -95,7 +95,7 @@ static PJ *destructor (PJ *P, int errlev) { if (static_cast<struct pj_opaque*>(P->opaque)->en) free (static_cast<struct pj_opaque*>(P->opaque)->en); - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); } @@ -104,11 +104,11 @@ PJ *PROJECTION(rouss) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if (!((Q->en = proj_mdist_ini(P->es)))) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); es2 = sin(P->phi0); Q->s0 = proj_mdist(P->phi0, es2, cos(P->phi0), Q->en); diff --git a/src/projections/rpoly.cpp b/src/projections/rpoly.cpp index e3f09c59..0c55954d 100644 --- a/src/projections/rpoly.cpp +++ b/src/projections/rpoly.cpp @@ -46,7 +46,7 @@ static PJ_XY rpoly_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar PJ *PROJECTION(rpoly) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->phi1 = fabs(pj_param(P->ctx, P->params, "rlat_ts").f); diff --git a/src/projections/sch.cpp b/src/projections/sch.cpp index 359e8efc..d10ccf6c 100644 --- a/src/projections/sch.cpp +++ b/src/projections/sch.cpp @@ -131,7 +131,7 @@ static PJ *setup(PJ *P) { /* general initialization */ // Pass a dummy ellipsoid definition that will be overridden just afterwards Q->cart = proj_create(P->ctx, "+proj=cart +a=1"); if (Q->cart == nullptr) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); /* inherit ellipsoid definition from P to Q->cart */ pj_inherit_ellipsoid_def (P, Q->cart); @@ -154,7 +154,7 @@ static PJ *setup(PJ *P) { /* general initialization */ /* Set up local sphere at the given peg point */ Q->cart_sph = proj_create(P->ctx, "+proj=cart +a=1"); if (Q->cart_sph == nullptr) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); pj_calc_ellipsoid_params(Q->cart_sph, Q->rcurv, 0); /* Set up the transformation matrices */ @@ -186,7 +186,7 @@ static PJ *setup(PJ *P) { /* general initialization */ PJ *PROJECTION(sch) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; P->destructor = destructor; @@ -196,21 +196,24 @@ PJ *PROJECTION(sch) { if (pj_param(P->ctx, P->params, "tplat_0").i) Q->plat = pj_param(P->ctx, P->params, "rplat_0").f; else { - return pj_default_destructor(P, PJD_ERR_FAILED_TO_FIND_PROJ); + proj_log_error(P, _("Missing parameter plat_0.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } /* Check if peg longitude was defined */ if (pj_param(P->ctx, P->params, "tplon_0").i) Q->plon = pj_param(P->ctx, P->params, "rplon_0").f; else { - return pj_default_destructor(P, PJD_ERR_FAILED_TO_FIND_PROJ); + proj_log_error(P, _("Missing parameter plon_0.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } /* Check if peg heading is defined */ if (pj_param(P->ctx, P->params, "tphdg_0").i) Q->phdg = pj_param(P->ctx, P->params, "rphdg_0").f; else { - return pj_default_destructor(P, PJD_ERR_FAILED_TO_FIND_PROJ); + proj_log_error(P, _("Missing parameter phdg_0.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } diff --git a/src/projections/sconics.cpp b/src/projections/sconics.cpp index c12b05a2..9084404c 100644 --- a/src/projections/sconics.cpp +++ b/src/projections/sconics.cpp @@ -48,15 +48,28 @@ static int phi12(PJ *P, double *del) { double p1, p2; int err = 0; - if (!pj_param(P->ctx, P->params, "tlat_1").i || - !pj_param(P->ctx, P->params, "tlat_2").i) { - err = -41; - } else { + if (!pj_param(P->ctx, P->params, "tlat_1").i ) + { + proj_log_error(P, _("Missing parameter: lat_1 should be specified")); + err = PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; + } + else if ( !pj_param(P->ctx, P->params, "tlat_2").i) + { + proj_log_error(P, _("Missing parameter: lat_2 should be specified")); + err = PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE; + } + else + { p1 = pj_param(P->ctx, P->params, "rlat_1").f; p2 = pj_param(P->ctx, P->params, "rlat_2").f; *del = 0.5 * (p2 - p1); - static_cast<struct pj_opaque*>(P->opaque)->sig = 0.5 * (p2 + p1); - err = (fabs(*del) < EPS || fabs(static_cast<struct pj_opaque*>(P->opaque)->sig) < EPS) ? PJD_ERR_ABS_LAT1_EQ_ABS_LAT2 : 0; + const double sig = 0.5 * (p2 + p1); + static_cast<struct pj_opaque*>(P->opaque)->sig = sig; + err = (fabs(*del) < EPS || fabs(sig) < EPS) ? PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE : 0; + if( err ) + { + proj_log_error(P, _("Illegal value for lat_1 and lat_2: |lat_1 - lat_2| and |lat_1 + lat_2| should be > 0")); + } } return err; } @@ -119,7 +132,7 @@ static PJ *setup(PJ *P, enum Type type) { int err; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->type = type; @@ -167,8 +180,10 @@ static PJ *setup(PJ *P, enum Type type) { Q->c1 = 1./tan (Q->sig); del = P->phi0 - Q->sig; if (fabs (del) - EPS10 >= M_HALFPI) - return pj_default_destructor(P, PJD_ERR_LAT_0_HALF_PI_FROM_MEAN); - + { + proj_log_error(P, _("Invalid value for lat_0/lat_1/lat_2: |lat_0 - 0.5 * (lat_1 + lat_2)| should be < 90°")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } Q->rho_0 = Q->c2 * (Q->c1 - tan (del)); break; diff --git a/src/projections/somerc.cpp b/src/projections/somerc.cpp index a184500c..af8c0b17 100644 --- a/src/projections/somerc.cpp +++ b/src/projections/somerc.cpp @@ -62,7 +62,7 @@ static PJ_LP somerc_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver lp.phi = phip; lp.lam = lamp / Q->c; } else { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } return (lp); @@ -73,7 +73,7 @@ PJ *PROJECTION(somerc) { double cp, phip0, sp; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; diff --git a/src/projections/stere.cpp b/src/projections/stere.cpp index ad1caae2..4646db3d 100644 --- a/src/projections/stere.cpp +++ b/src/projections/stere.cpp @@ -60,7 +60,7 @@ static PJ_XY stere_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forwar const double denom = Q->cosX1 * (1. + Q->sinX1 * sinX + Q->cosX1 * cosX * coslam); if( denom == 0 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } A = Q->akm1 / denom; @@ -117,7 +117,7 @@ static PJ_XY stere_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar xy.y = 1. + sinph0 * sinphi + cosph0 * cosphi * coslam; oblcon: if (xy.y <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.y = Q->akm1 / xy.y; @@ -131,7 +131,7 @@ oblcon: /*-fallthrough*/ case S_POLE: if (fabs (lp.phi - M_HALFPI) < TOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.y = Q->akm1 * tan (M_FORTPI + .5 * lp.phi); @@ -190,7 +190,7 @@ static PJ_LP stere_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, invers phi_l = lp.phi; } - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } @@ -304,7 +304,7 @@ static PJ *setup(PJ *P) { /* general initialization */ PJ *PROJECTION(stere) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->phits = pj_param (P->ctx, P->params, "tlat_ts").i ? @@ -317,13 +317,14 @@ PJ *PROJECTION(stere) { PJ *PROJECTION(ups) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; /* International Ellipsoid */ P->phi0 = pj_param(P->ctx, P->params, "bsouth").i ? - M_HALFPI: M_HALFPI; if (P->es == 0.0) { - return pj_default_destructor (P, PJD_ERR_ELLIPSOID_USE_REQUIRED); + proj_log_error(P, _("Invalid value for es: only ellipsoidal formulation supported")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } P->k0 = .994; P->x0 = 2000000.; diff --git a/src/projections/sterea.cpp b/src/projections/sterea.cpp index 4dd22d2f..28fdea2e 100644 --- a/src/projections/sterea.cpp +++ b/src/projections/sterea.cpp @@ -55,7 +55,7 @@ static PJ_XY sterea_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forwa cosl = cos(lp.lam); const double denom = 1. + Q->sinc0 * sinc + Q->cosc0 * cosc * cosl; if( denom == 0.0 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xy; } k = P->k0 * Q->R2 / denom; @@ -103,12 +103,12 @@ PJ *PROJECTION(sterea) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->en = pj_gauss_ini(P->e, P->phi0, &(Q->phic0), &R); if (nullptr==Q->en) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->sinc0 = sin (Q->phic0); Q->cosc0 = cos (Q->phic0); diff --git a/src/projections/sts.cpp b/src/projections/sts.cpp index 75190e85..cdd59044 100644 --- a/src/projections/sts.cpp +++ b/src/projections/sts.cpp @@ -72,7 +72,7 @@ static PJ *setup(PJ *P, double p, double q, int mode) { PJ *PROJECTION(fouc) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; return setup(P, 2., 2., 1); } @@ -82,7 +82,7 @@ PJ *PROJECTION(fouc) { PJ *PROJECTION(kav5) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; return setup(P, 1.50488, 1.35439, 0); @@ -93,7 +93,7 @@ PJ *PROJECTION(kav5) { PJ *PROJECTION(qua_aut) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; return setup(P, 2., 2., 0); } @@ -103,7 +103,7 @@ PJ *PROJECTION(qua_aut) { PJ *PROJECTION(mbt_s) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; return setup(P, 1.48875, 1.36509, 0); } diff --git a/src/projections/tcc.cpp b/src/projections/tcc.cpp index 9413b567..c53bed05 100644 --- a/src/projections/tcc.cpp +++ b/src/projections/tcc.cpp @@ -16,7 +16,7 @@ static PJ_XY tcc_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward const double b = cos (lp.phi) * sin (lp.lam); const double bt = 1. - b * b; if (bt < EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } xy.x = b / sqrt(bt); diff --git a/src/projections/tmerc.cpp b/src/projections/tmerc.cpp index 8f897061..3093e745 100644 --- a/src/projections/tmerc.cpp +++ b/src/projections/tmerc.cpp @@ -89,7 +89,7 @@ static PJ_XY approx_e_fwd (PJ_LP lp, PJ *P) if( lp.lam < -M_HALFPI || lp.lam > M_HALFPI ) { xy.x = HUGE_VAL; xy.y = HUGE_VAL; - proj_context_errno_set( P->ctx, PJD_ERR_LAT_OR_LON_EXCEED_LIMIT ); + proj_context_errno_set( P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN ); return xy; } @@ -123,7 +123,7 @@ static PJ_XY tmerc_spherical_fwd (PJ_LP lp, PJ *P) { cosphi = cos(lp.phi); b = cosphi * sin (lp.lam); if (fabs (fabs (b) - 1.) <= EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } @@ -138,7 +138,7 @@ static PJ_XY tmerc_spherical_fwd (PJ_LP lp, PJ *P) { } else if (b >= 1.) { if ((b - 1.) > EPS10) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } else xy.y = 0.; @@ -190,7 +190,7 @@ static PJ_LP tmerc_spherical_inv (PJ_XY xy, PJ *P) { h = exp(xy.x / Q->esp); if( h == 0 ) { - proj_errno_set(P, PJD_ERR_INVALID_X_OR_Y); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } g = .5 * (h - 1. / h); @@ -224,7 +224,7 @@ static PJ *setup_approx(PJ *P) { if (P->es != 0.0) { if (!(Q->en = pj_enfn(P->es))) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); Q->ml0 = pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), Q->en); Q->esp = P->es / (1. - P->es); @@ -587,7 +587,7 @@ static PJ *setup(PJ *P, TMercAlgo eAlg) { struct tmerc_data *Q = static_cast<struct tmerc_data*>(calloc (1, sizeof (struct tmerc_data))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if( P->es == 0 ) @@ -701,14 +701,18 @@ PJ *PROJECTION(tmerc) { TMercAlgo algo; if( !getAlgoFromParams(P, algo) ) - return pj_default_destructor(P, PJD_ERR_INVALID_ARG); + { + proj_log_error(P, _("Invalid value for algo")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } return setup(P, algo); } PJ *PROJECTION(etmerc) { if (P->es == 0.0) { - return pj_default_destructor(P, PJD_ERR_ELLIPSOID_USE_REQUIRED); + proj_log_error(P, _("Invalid value for eccentricity: it should not be zero")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } return setup (P, TMercAlgo::PODER_ENGSAGER); @@ -720,10 +724,12 @@ PJ *PROJECTION(etmerc) { PJ *PROJECTION(utm) { long zone; if (P->es == 0.0) { - return pj_default_destructor(P, PJD_ERR_ELLIPSOID_USE_REQUIRED); + proj_log_error(P, _("Invalid value for eccentricity: it should not be zero")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } if (P->lam0 < -1000.0 || P->lam0 > 1000.0) { - return pj_default_destructor(P, PJD_ERR_INVALID_UTM_ZONE); + proj_log_error(P, _("Invalid value for lon_0")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } P->y0 = pj_param (P->ctx, P->params, "bsouth").i ? 10000000. : 0.; @@ -734,7 +740,8 @@ PJ *PROJECTION(utm) { if (zone > 0 && zone <= 60) --zone; else { - return pj_default_destructor(P, PJD_ERR_INVALID_UTM_ZONE); + proj_log_error(P, _("Invalid value for zone")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } else /* nearest central meridian input */ @@ -751,6 +758,9 @@ PJ *PROJECTION(utm) { TMercAlgo algo; if( !getAlgoFromParams(P, algo) ) - return pj_default_destructor(P, PJD_ERR_INVALID_ARG); + { + proj_log_error(P, _("Invalid value for algo")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } return setup(P, algo); } diff --git a/src/projections/tobmerc.cpp b/src/projections/tobmerc.cpp index f05a9b6b..13633a91 100644 --- a/src/projections/tobmerc.cpp +++ b/src/projections/tobmerc.cpp @@ -20,7 +20,7 @@ static PJ_XY tobmerc_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forw // it's not even that large, merely 38.025...). Even if the logic was // such that phi was strictly equal to pi/2, allowing xy.y = inf would be // a reasonable result. - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } diff --git a/src/projections/tpeqd.cpp b/src/projections/tpeqd.cpp index 90efb395..d6d8e790 100644 --- a/src/projections/tpeqd.cpp +++ b/src/projections/tpeqd.cpp @@ -66,7 +66,7 @@ PJ *PROJECTION(tpeqd) { double lam_1, lam_2, phi_1, phi_2, A12; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; @@ -77,7 +77,10 @@ PJ *PROJECTION(tpeqd) { lam_2 = pj_param(P->ctx, P->params, "rlon_2").f; if (phi_1 == phi_2 && lam_1 == lam_2) - return pj_default_destructor(P, PJD_ERR_CONTROL_POINT_NO_DIST); + { + proj_log_error(P, _("Invalid value for lat_1/lon_1/lat_2/lon_2: the 2 points should be distinct.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } P->lam0 = adjlon (0.5 * (lam_1 + lam_2)); Q->dlam2 = adjlon (lam_2 - lam_1); @@ -92,7 +95,8 @@ PJ *PROJECTION(tpeqd) { Q->z02 = aacos(P->ctx, Q->sp1 * Q->sp2 + Q->cp1 * Q->cp2 * cos (Q->dlam2)); if( Q->z02 == 0.0 ) { // Actually happens when both lat_1 = lat_2 and |lat_1| = 90 - return pj_default_destructor(P, PJD_ERR_LAT_1_OR_2_ZERO_OR_90); + proj_log_error(P, _("Invalid value for lat_1 and lat_2: their absolute value should be < 90°.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->hz0 = .5 * Q->z02; A12 = atan2(Q->cp2 * sin (Q->dlam2), diff --git a/src/projections/urm5.cpp b/src/projections/urm5.cpp index c3021841..25db4391 100644 --- a/src/projections/urm5.cpp +++ b/src/projections/urm5.cpp @@ -32,22 +32,29 @@ PJ *PROJECTION(urm5) { double alpha, t; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; - if (pj_param(P->ctx, P->params, "tn").i) { - Q->n = pj_param(P->ctx, P->params, "dn").f; - if (Q->n <= 0. || Q->n > 1.) - return pj_default_destructor(P, PJD_ERR_N_OUT_OF_RANGE); - } else { - return pj_default_destructor(P, PJD_ERR_N_OUT_OF_RANGE); + if (!pj_param(P->ctx, P->params, "tn").i ) + { + proj_log_error(P, _("Missing parameter n.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } + + Q->n = pj_param(P->ctx, P->params, "dn").f; + if (Q->n <= 0. || Q->n > 1.) + { + proj_log_error(P, _("Invalid value for n: it should be in ]0,1] range.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + Q->q3 = pj_param(P->ctx, P->params, "dq").f / 3.; alpha = pj_param(P->ctx, P->params, "ralpha").f; t = Q->n * sin (alpha); const double denom = sqrt (1. - t * t); if( denom == 0 ) { - return pj_default_destructor(P, PJD_ERR_LAT_0_OR_ALPHA_EQ_90); + proj_log_error(P, _("Invalid value for n / alpha: n * sin(|alpha|) should be < 1.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } Q->m = cos (alpha) / denom; Q->rmn = 1. / (Q->m * Q->n); diff --git a/src/projections/urmfps.cpp b/src/projections/urmfps.cpp index 5d689f9f..36c2b7d1 100644 --- a/src/projections/urmfps.cpp +++ b/src/projections/urmfps.cpp @@ -49,16 +49,21 @@ static PJ *setup(PJ *P) { PJ *PROJECTION(urmfps) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; - if (pj_param(P->ctx, P->params, "tn").i) { - static_cast<struct pj_opaque*>(P->opaque)->n = pj_param(P->ctx, P->params, "dn").f; - if (static_cast<struct pj_opaque*>(P->opaque)->n <= 0. || static_cast<struct pj_opaque*>(P->opaque)->n > 1.) - return pj_default_destructor(P, PJD_ERR_N_OUT_OF_RANGE); - } else { - return pj_default_destructor(P, PJD_ERR_N_OUT_OF_RANGE); + if (!pj_param(P->ctx, P->params, "tn").i ) + { + proj_log_error(P, _("Missing parameter n.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } + + Q->n = pj_param(P->ctx, P->params, "dn").f; + if (Q->n <= 0. || Q->n > 1.) + { + proj_log_error(P, _("Invalid value for n: it should be in ]0,1] range.")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } return setup(P); @@ -68,7 +73,7 @@ PJ *PROJECTION(urmfps) { PJ *PROJECTION(wag1) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; static_cast<struct pj_opaque*>(P->opaque)->n = 0.8660254037844386467637231707; diff --git a/src/projections/vandg.cpp b/src/projections/vandg.cpp index 107fc3b9..603aa35c 100644 --- a/src/projections/vandg.cpp +++ b/src/projections/vandg.cpp @@ -19,7 +19,7 @@ static PJ_XY vandg_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar // Comments tie this formulation to Snyder (1987), p. 241. p2 = fabs(lp.phi / M_HALFPI); // sin(theta) from (29-6) if ((p2 - TOL) > 1.) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } if (p2 > 1.) @@ -56,7 +56,7 @@ static PJ_XY vandg_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar // y from (29-2) has been expressed in terms of x here xy.y = 1. - xy.y * (xy.y + 2. * al); if (xy.y < -TOL) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return xy; } if (xy.y < 0.) @@ -95,7 +95,7 @@ static PJ_LP vandg_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers d = C2_27 * c2 * c2 * c2 + (c0 * c0 - THIRD * c2 * c1) / c3; // d (29-14) const double al_mul_m = al * m; // a1*m1 if( fabs(al_mul_m) < 1e-16 ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lp; } d = 3. * d /al_mul_m; // cos(3*theta1) (29-17) @@ -109,7 +109,7 @@ static PJ_LP vandg_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers lp.lam = fabs(xy.x) <= TOL ? 0. : .5 * (r - PISQ + (t <= 0. ? 0. : sqrt(t))) / xy.x; } else { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return lp; } diff --git a/src/projections/vandg2.cpp b/src/projections/vandg2.cpp index cd7e7b6c..d3067952 100644 --- a/src/projections/vandg2.cpp +++ b/src/projections/vandg2.cpp @@ -55,7 +55,7 @@ static PJ_XY vandg2_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwa PJ *PROJECTION(vandg2) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->vdg3 = 0; @@ -67,7 +67,7 @@ PJ *PROJECTION(vandg2) { PJ *PROJECTION(vandg3) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; Q->vdg3 = 1; diff --git a/src/projections/wag3.cpp b/src/projections/wag3.cpp index ed3250ef..c7308c51 100644 --- a/src/projections/wag3.cpp +++ b/src/projections/wag3.cpp @@ -37,7 +37,7 @@ PJ *PROJECTION(wag3) { double ts; struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; diff --git a/src/projections/wink1.cpp b/src/projections/wink1.cpp index f4ffafe3..0e68c1ab 100644 --- a/src/projections/wink1.cpp +++ b/src/projections/wink1.cpp @@ -35,7 +35,7 @@ static PJ_LP wink1_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers PJ *PROJECTION(wink1) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; static_cast<struct pj_opaque*>(P->opaque)->cosphi1 = cos (pj_param(P->ctx, P->params, "rlat_ts").f); diff --git a/src/projections/wink2.cpp b/src/projections/wink2.cpp index b5b1e812..d3ba49d5 100644 --- a/src/projections/wink2.cpp +++ b/src/projections/wink2.cpp @@ -55,7 +55,7 @@ static PJ_LP wink2_s_inverse(PJ_XY xy, PJ *P) PJ *PROJECTION(wink2) { struct pj_opaque *Q = static_cast<struct pj_opaque*>(calloc (1, sizeof (struct pj_opaque))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; static_cast<struct pj_opaque*>(P->opaque)->cosphi1 = cos(pj_param(P->ctx, P->params, "rlat_1").f); diff --git a/src/strerrno.cpp b/src/strerrno.cpp index 3d0131c6..f94de55d 100644 --- a/src/strerrno.cpp +++ b/src/strerrno.cpp @@ -8,103 +8,68 @@ #include "proj_config.h" #include "proj_internal.h" -static const char * const -pj_err_list[] = { - "no arguments in initialization list", /* -1 */ - "no options found in 'init' file", /* -2 */ - "no colon in init= string", /* -3 */ - "projection not named", /* -4 */ - "unknown projection id", /* -5 */ - "effective eccentricity < 0 or >= 1.", /* -6 */ - "unknown unit conversion id", /* -7 */ - "invalid boolean param argument", /* -8 */ - "unknown elliptical parameter name", /* -9 */ - "reciprocal flattening (1/f) = 0", /* -10 */ - "|radius reference latitude| > 90", /* -11 */ - "squared eccentricity < 0", /* -12 */ - "major axis or radius = 0 or not given", /* -13 */ - "latitude or longitude exceeded limits", /* -14 */ - "invalid x or y", /* -15 */ - "improperly formed DMS value", /* -16 */ - "non-convergent inverse meridional dist", /* -17 */ - "non-convergent sinh(psi) to tan(phi)", /* -18 */ - "acos/asin: |arg| >1.+1e-14", /* -19 */ - "tolerance condition error", /* -20 */ - "conic lat_1 = -lat_2", /* -21 */ - "lat_0, lat_1 or lat_2 >= 90", /* -22 */ - "lat_1 = 0", /* -23 */ - "lat_ts >= 90", /* -24 */ - "no distance between control points", /* -25 */ - "projection not selected to be rotated", /* -26 */ - "W <= 0 or M <= 0", /* -27 */ - "lsat not in 1-5 range", /* -28 */ - "path not in range", /* -29 */ - "h <= 0 or h > 1e10 * a", /* -30 */ - "k <= 0", /* -31 */ - "lat_1=lat_2 or lat_1=0 or lat_2=90", /* -32 */ - "lat_0 = 0 or 90 or alpha = 90", /* -33 */ - "elliptical usage required", /* -34 */ - "invalid UTM zone number", /* -35 */ - "", /* no longer used */ /* -36 */ - "failed to find projection to be rotated", /* -37 */ - "failed to load datum shift file", /* -38 */ - "both n & m must be spec'd and > 0", /* -39 */ - "n <= 0, n > 1 or not specified", /* -40 */ - "lat_1 or lat_2 not specified", /* -41 */ - "|lat_1| == |lat_2|", /* -42 */ - "lat_0 is pi/2 from mean lat", /* -43 */ - "unparseable coordinate system definition", /* -44 */ - "geocentric transformation missing z or ellps", /* -45 */ - "unknown prime meridian conversion id", /* -46 */ - "illegal axis orientation combination", /* -47 */ - "point not within available datum shift grids", /* -48 */ - "invalid sweep axis, choose x or y", /* -49 */ - "malformed pipeline", /* -50 */ - "unit conversion factor must be > 0", /* -51 */ - "invalid scale", /* -52 */ - "non-convergent computation", /* -53 */ - "missing required arguments", /* -54 */ - "lat_0 = 0", /* -55 */ - "ellipsoidal usage unsupported", /* -56 */ - "only one +init allowed for non-pipeline operations", /* -57 */ - "argument not numerical or out of range", /* -58 */ - "inconsistent unit type between input and output", /* -59 */ - "arguments are mutually exclusive", /* -60 */ - "generic error of unknown origin", /* -61 */ - "network error", /* -62 */ - /* When adding error messages, remember to update ID defines in - src/proj_internal.h and src/apps/gie.cpp */ -}; +const char* proj_errno_string(int err) { + return proj_context_errno_string(pj_get_default_ctx(), err); +} +static const struct +{ + int num; + const char *str; +} error_strings[] = { -const char* proj_errno_string(int err) { - const int max_error = 9999; - static char note[50]; - size_t adjusted_err; + { PROJ_ERR_INVALID_OP_WRONG_SYNTAX, _("Invalid PROJ string syntax") }, + { PROJ_ERR_INVALID_OP_MISSING_ARG, _("Missing argument") }, + { PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE, _("Invalid value for an argument") }, + { PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS, _("Mutually exclusive arguments") }, + { PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID, _("File not found or invalid") }, + { PROJ_ERR_COORD_TRANSFM_INVALID_COORD, _("Invalid coordinate") }, + { PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN, _("Point outside of projection domain") }, + { PROJ_ERR_COORD_TRANSFM_NO_OPERATION, _("No operation matching criteria found for coordinate") }, + { PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID, _("Coordinate to transform falls outside grid") }, + { PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA, _("Coordinate to transform falls into a grid cell that evaluates to nodata") }, + { PROJ_ERR_OTHER_API_MISUSE, _("API misuse") }, + { PROJ_ERR_OTHER_NO_INVERSE_OP, _("No inverse operation") }, + { PROJ_ERR_OTHER_NETWORK_ERROR, _("Network error when accessing a remote resource") }, +}; + +const char PROJ_DLL * proj_context_errno_string(PJ_CONTEXT* ctx, int err) +{ + if( ctx == nullptr ) + ctx = pj_get_default_ctx(); if (0==err) return nullptr; - /* System error codes are positive */ - if (err > 0) { -#ifdef HAVE_STRERROR - return strerror(err); -#else - /* Defend string boundary against exorbitantly large err values */ - /* which may occur on platforms with 64-bit ints */ - sprintf(note, "no system list, errno: %d\n", - (err < max_error) ? err: max_error); - return note; -#endif + const char* str = nullptr; + for( const auto& num_str_pair: error_strings ) + { + if( err == num_str_pair.num ) + { + str = num_str_pair.str; + break; + } } - /* PROJ error codes are negative: -1 to -9999 */ - adjusted_err = err < -max_error ? max_error : -err - 1; - if (adjusted_err < (sizeof(pj_err_list) / sizeof(char *))) - return (char *)pj_err_list[adjusted_err]; + if( str == nullptr && err > 0 && (err & PROJ_ERR_INVALID_OP) != 0 ) + { + str = _("Unspecified error related to coordinate operation initialization"); + } + if( str == nullptr && err > 0 && (err & PROJ_ERR_COORD_TRANSFM) != 0 ) + { + str = _("Unspecified error related to coordinate transformation"); + } - sprintf(note, "invalid projection system error (%d)", - (err > -max_error) ? err: -max_error); - return note; + if (str) { + ctx->lastFullErrorMessage = str; + } + else + { + ctx->lastFullErrorMessage.resize(50); + snprintf(&ctx->lastFullErrorMessage[0], ctx->lastFullErrorMessage.size(), + _("Unknown error (code %d)"), err); + ctx->lastFullErrorMessage.resize(strlen(ctx->lastFullErrorMessage.data())); + } + return ctx->lastFullErrorMessage.c_str(); } diff --git a/src/transformations/affine.cpp b/src/transformations/affine.cpp index 43fd8642..8b927688 100644 --- a/src/transformations/affine.cpp +++ b/src/transformations/affine.cpp @@ -176,7 +176,7 @@ static void computeReverseParameters(PJ* P) PJ *TRANSFORMATION(affine,0 /* no need for ellipsoid */) { struct pj_opaque_affine *Q = initQ(); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = (void *) Q; P->fwd4d = forward_4d; @@ -227,7 +227,7 @@ PJ *TRANSFORMATION(affine,0 /* no need for ellipsoid */) { PJ *TRANSFORMATION(geogoffset,0 /* no need for ellipsoid */) { struct pj_opaque_affine *Q = initQ(); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = (void *) Q; P->fwd4d = forward_4d; diff --git a/src/transformations/defmodel.cpp b/src/transformations/defmodel.cpp index 3d0f2a58..89e0429f 100644 --- a/src/transformations/defmodel.cpp +++ b/src/transformations/defmodel.cpp @@ -390,7 +390,7 @@ PJ *TRANSFORMATION(defmodel, 1) { // Pass a dummy ellipsoid definition that will be overridden just afterwards auto cart = proj_create(P->ctx, "+proj=cart +a=1"); if (cart == nullptr) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); /* inherit ellipsoid definition from P to Q->cart */ pj_inherit_ellipsoid_def(P, cart); @@ -402,14 +402,14 @@ PJ *TRANSFORMATION(defmodel, 1) { const char *model = pj_param(P->ctx, P->params, "smodel").s; if (!model) { - proj_log_error(P, "defmodel: +model= should be specified."); - return destructor(P, PJD_ERR_NO_ARGS); + proj_log_error(P, _("defmodel: +model= should be specified.")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } auto file = NS_PROJ::FileManager::open_resource_file(P->ctx, model); if (nullptr == file) { - proj_log_error(P, "defmodel: Cannot open %s", model); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("defmodel: Cannot open %s"), model); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } file->seek(0, SEEK_END); unsigned long long size = file->tell(); @@ -417,23 +417,23 @@ PJ *TRANSFORMATION(defmodel, 1) { // that could be a denial of service risk. 10 MB should be sufficiently // large for any valid use ! if (size > 10 * 1024 * 1024) { - proj_log_error(P, "defmodel: File %s too large", model); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("defmodel: File %s too large"), model); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } file->seek(0); std::string jsonStr; jsonStr.resize(static_cast<size_t>(size)); if (file->read(&jsonStr[0], jsonStr.size()) != jsonStr.size()) { - proj_log_error(P, "defmodel: Cannot read %s", model); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("defmodel: Cannot read %s"), model); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } try { Q->evaluator.reset(new Evaluator<Grid, GridSet, EvaluatorIface>( MasterFile::parse(jsonStr), Q->evaluatorIface, P->a, P->b)); } catch (const std::exception &e) { - proj_log_error(P, "defmodel: invalid model: %s", e.what()); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("defmodel: invalid model: %s"), e.what()); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } P->fwd4d = forward_4d; diff --git a/src/transformations/deformation.cpp b/src/transformations/deformation.cpp index 8ce02bee..307de85f 100644 --- a/src/transformations/deformation.cpp +++ b/src/transformations/deformation.cpp @@ -179,7 +179,7 @@ static PJ_XYZ get_grid_shift(PJ* P, const PJ_XYZ& cartesian) { shift.lp = pj_hgrid_value(P, Q->hgrids, geodetic.lp); shift.enu.u = pj_vgrid_value(P, Q->vgrids, geodetic.lp, 1.0); - if (proj_errno(P) == PJD_ERR_GRID_AREA) + if (proj_errno(P) == PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID) proj_log_debug(P, "deformation: coordinate (%.3f, %.3f) outside deformation model", proj_todeg(geodetic.lpz.lam), proj_todeg(geodetic.lpz.phi)); @@ -358,7 +358,7 @@ PJ *TRANSFORMATION(deformation,1) { // Pass a dummy ellipsoid definition that will be overridden just afterwards Q->cart = proj_create(P->ctx, "+proj=cart +a=1"); if (Q->cart == nullptr) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); /* inherit ellipsoid definition from P to Q->cart */ pj_inherit_ellipsoid_def (P, Q->cart); @@ -369,8 +369,8 @@ PJ *TRANSFORMATION(deformation,1) { /* Build gridlists. Both horizontal and vertical grids are mandatory. */ if ( !has_grids && (!has_xy_grids || !has_z_grids)) { - proj_log_error(P, "deformation: Either +grids or (+xy_grids and +z_grids) should be specified."); - return destructor(P, PJD_ERR_NO_ARGS ); + proj_log_error(P, _("deformation: Either +grids or (+xy_grids and +z_grids) should be specified.")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG ); } if( has_grids ) @@ -378,22 +378,22 @@ PJ *TRANSFORMATION(deformation,1) { Q->grids = pj_generic_grid_init(P, "grids"); /* Was gridlist compiled properly? */ if ( proj_errno(P) ) { - proj_log_error(P, "deformation: could not find required grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_log_error(P, _("deformation: could not find required grid(s).)")); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } } else { Q->hgrids = pj_hgrid_init(P, "xy_grids"); if (proj_errno(P)) { - proj_log_error(P, "deformation: could not find requested xy_grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_log_error(P, _("deformation: could not find requested xy_grid(s).")); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } Q->vgrids = pj_vgrid_init(P, "z_grids"); if (proj_errno(P)) { - proj_log_error(P, "deformation: could not find requested z_grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_log_error(P, _("deformation: could not find requested z_grid(s).")); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } } @@ -403,8 +403,8 @@ PJ *TRANSFORMATION(deformation,1) { } if (pj_param_exists(P->params, "t_obs")) { - proj_log_error(P, "deformation: +t_obs parameter is deprecated. Use +dt instead."); - return destructor(P, PJD_ERR_MISSING_ARGS); + proj_log_error(P, _("deformation: +t_obs parameter is deprecated. Use +dt instead.")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } Q->t_epoch = HUGE_VAL; @@ -413,13 +413,13 @@ PJ *TRANSFORMATION(deformation,1) { } if (Q->dt == HUGE_VAL && Q->t_epoch == HUGE_VAL) { - proj_log_error(P, "deformation: either +dt or +t_epoch needs to be set."); - return destructor(P, PJD_ERR_MISSING_ARGS); + proj_log_error(P, _("deformation: either +dt or +t_epoch needs to be set.")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } if (Q->dt != HUGE_VALL && Q->t_epoch != HUGE_VALL) { - proj_log_error(P, "deformation: +dt or +t_epoch are mutually exclusive."); - return destructor(P, PJD_ERR_MUTUALLY_EXCLUSIVE_ARGS); + proj_log_error(P, _("deformation: +dt or +t_epoch are mutually exclusive.")); + return destructor(P, PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS); } P->fwd4d = forward_4d; diff --git a/src/transformations/helmert.cpp b/src/transformations/helmert.cpp index 99aa74a4..edb85355 100644 --- a/src/transformations/helmert.cpp +++ b/src/transformations/helmert.cpp @@ -478,7 +478,7 @@ static PJ_COORD helmert_reverse_4d (PJ_COORD point, PJ *P) { static PJ* init_helmert_six_parameters(PJ* P) { struct pj_opaque_helmert *Q = static_cast<struct pj_opaque_helmert*>(calloc (1, sizeof (struct pj_opaque_helmert))); if (nullptr==Q) - return pj_default_destructor (P, ENOMEM); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = (void *) Q; /* In most cases, we work on 3D cartesian coordinates */ @@ -522,8 +522,8 @@ static PJ* read_convention(PJ* P) { if (!Q->no_rotation) { const char* convention = pj_param (P->ctx, P->params, "sconvention").s; if( !convention ) { - proj_log_error (P, "helmert: missing 'convention' argument"); - return pj_default_destructor (P, PJD_ERR_MISSING_ARGS); + proj_log_error (P, _("helmert: missing 'convention' argument")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } if( strcmp(convention, "position_vector") == 0 ) { Q->is_position_vector = 1; @@ -532,17 +532,17 @@ static PJ* read_convention(PJ* P) { Q->is_position_vector = 0; } else { - proj_log_error (P, "helmert: invalid value for 'convention' argument"); - return pj_default_destructor (P, PJD_ERR_INVALID_ARG); + proj_log_error (P, _("helmert: invalid value for 'convention' argument")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } /* historically towgs84 in PROJ has always been using position_vector * convention. Accepting coordinate_frame would be confusing. */ if (pj_param_exists (P->params, "towgs84")) { if( !Q->is_position_vector ) { - proj_log_error (P, "helmert: towgs84 should only be used with " - "convention=position_vector"); - return pj_default_destructor (P, PJD_ERR_INVALID_ARG); + proj_log_error (P, _("helmert: towgs84 should only be used with " + "convention=position_vector")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } } @@ -578,9 +578,9 @@ PJ *TRANSFORMATION(helmert, 0) { /* Detect obsolete transpose flag and error out if found */ if (pj_param (P->ctx, P->params, "ttranspose").i) { - proj_log_error (P, "helmert: 'transpose' argument is no longer valid. " - "Use convention=position_vector/coordinate_frame"); - return pj_default_destructor (P, PJD_ERR_INVALID_ARG); + proj_log_error (P, _("helmert: 'transpose' argument is no longer valid. " + "Use convention=position_vector/coordinate_frame")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } /* Support the classic PROJ towgs84 parameter, but allow later overrides.*/ @@ -612,9 +612,15 @@ PJ *TRANSFORMATION(helmert, 0) { if (pj_param (P->ctx, P->params, "ts").i) { Q->scale_0 = pj_param (P->ctx, P->params, "ds").f; if( Q->scale_0 <= -1.0e6 ) - return pj_default_destructor (P, PJD_ERR_INVALID_SCALE); + { + proj_log_error (P, _("helmert: invalid value for s.")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } if (pj_param (P->ctx, P->params, "ttheta").i && Q->scale_0 == 0.0) - return pj_default_destructor (P, PJD_ERR_INVALID_SCALE); + { + proj_log_error (P, _("helmert: invalid value for s.")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } } /* Translation rates */ diff --git a/src/transformations/hgridshift.cpp b/src/transformations/hgridshift.cpp index b28eaf48..1b2ff9b1 100644 --- a/src/transformations/hgridshift.cpp +++ b/src/transformations/hgridshift.cpp @@ -155,8 +155,8 @@ PJ *TRANSFORMATION(hgridshift,0) { P->right = PJ_IO_UNITS_RADIANS; if (0==pj_param(P->ctx, P->params, "tgrids").i) { - proj_log_error(P, "hgridshift: +grids parameter missing."); - return destructor (P, PJD_ERR_NO_ARGS); + proj_log_error(P, _("hgridshift: +grids parameter missing.")); + return destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } /* TODO: Refactor into shared function that can be used */ @@ -194,8 +194,8 @@ PJ *TRANSFORMATION(hgridshift,0) { Q->grids = pj_hgrid_init(P, "grids"); /* Was gridlist compiled properly? */ if ( proj_errno(P) ) { - proj_log_error(P, "hgridshift: could not find required grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_log_error(P, _("hgridshift: could not find required grid(s).")); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } gMutex.lock(); diff --git a/src/transformations/horner.cpp b/src/transformations/horner.cpp index 2c049186..d88ea152 100644 --- a/src/transformations/horner.cpp +++ b/src/transformations/horner.cpp @@ -460,12 +460,12 @@ PJ *PROJECTION(horner) { degree = pj_param(P->ctx, P->params, "ideg").i; if (degree < 0 || degree > 10000) { /* What are reasonable minimum and maximums for degree? */ - proj_log_debug (P, "Horner: Degree is unreasonable: %d", degree); - return horner_freeup (P, PJD_ERR_INVALID_ARG); + proj_log_error (P, _("Horner: Degree is unreasonable: %d"), degree); + return horner_freeup (P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } else { - proj_log_debug (P, "Horner: Must specify polynomial degree, (+deg=n)"); - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + proj_log_error (P, _("Horner: Must specify polynomial degree, (+deg=n)")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } if (pj_param (P->ctx, P->params, "tfwd_c").i || pj_param (P->ctx, P->params, "tinv_c").i) /* complex polynomium? */ @@ -473,7 +473,7 @@ PJ *PROJECTION(horner) { Q = horner_alloc (degree, complex_polynomia); if (Q == nullptr) - return horner_freeup (P, ENOMEM); + return horner_freeup (P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = Q; if (complex_polynomia) { @@ -483,9 +483,15 @@ PJ *PROJECTION(horner) { n = 2*degree + 2; if (0==parse_coefs (P, Q->fwd_c, "fwd_c", n)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing fwd_c")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } if (0==parse_coefs (P, Q->inv_c, "inv_c", n)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing inv_c")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } P->fwd4d = complex_horner_forward_4d; P->inv4d = complex_horner_reverse_4d; } @@ -493,19 +499,37 @@ PJ *PROJECTION(horner) { else { n = horner_number_of_coefficients (degree); if (0==parse_coefs (P, Q->fwd_u, "fwd_u", n)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing fwd_u")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } if (0==parse_coefs (P, Q->fwd_v, "fwd_v", n)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing fwd_v")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } if (0==parse_coefs (P, Q->inv_u, "inv_u", n)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing inv_u")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } if (0==parse_coefs (P, Q->inv_v, "inv_v", n)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing inv_v")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } } if (0==parse_coefs (P, (double *)(Q->fwd_origin), "fwd_origin", 2)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing fwd_origin")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } if (0==parse_coefs (P, (double *)(Q->inv_origin), "inv_origin", 2)) - return horner_freeup (P, PJD_ERR_MISSING_ARGS); + { + proj_log_error (P, _("Horner: missing inv_origin")); + return horner_freeup (P, PROJ_ERR_INVALID_OP_MISSING_ARG); + } if (0==parse_coefs (P, &Q->range, "range", 1)) Q->range = 500000; diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index bf5960d2..4a6584a9 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -245,7 +245,7 @@ static PJ_XYZ forward_3d(PJ_LPZ lpz, PJ *P) { lpz = calc_standard_params(lpz, P); } if( lpz.lam == HUGE_VAL ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().xyz; } @@ -277,7 +277,7 @@ static PJ_LPZ reverse_3d(PJ_XYZ xyz, PJ *P) { lpz = calc_standard_params(point.lpz, P); if( lpz.lam == HUGE_VAL ) { - proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + proj_errno_set(P, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); return proj_coord_error().lpz; } @@ -297,10 +297,9 @@ static PJ_COORD reverse_4d(PJ_COORD obs, PJ *P) { PJ *TRANSFORMATION(molodensky,1) { - int count_required_params = 0; struct pj_opaque_molodensky *Q = static_cast<struct pj_opaque_molodensky*>(calloc(1, sizeof(struct pj_opaque_molodensky))); if (nullptr==Q) - return pj_default_destructor(P, ENOMEM); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); P->opaque = (void *) Q; P->fwd4d = forward_4d; @@ -314,39 +313,42 @@ PJ *TRANSFORMATION(molodensky,1) { P->right = PJ_IO_UNITS_RADIANS; /* read args */ - if (pj_param(P->ctx, P->params, "tdx").i) { - count_required_params ++; - Q->dx = pj_param(P->ctx, P->params, "ddx").f; + if (!pj_param(P->ctx, P->params, "tdx").i) + { + proj_log_error (P, _("molodensky: missing dx")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } + Q->dx = pj_param(P->ctx, P->params, "ddx").f; - if (pj_param(P->ctx, P->params, "tdy").i) { - count_required_params ++; - Q->dy = pj_param(P->ctx, P->params, "ddy").f; + if (!pj_param(P->ctx, P->params, "tdy").i) + { + proj_log_error (P, _("molodensky: missing dy")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } + Q->dy = pj_param(P->ctx, P->params, "ddy").f; - if (pj_param(P->ctx, P->params, "tdz").i) { - count_required_params ++; - Q->dz = pj_param(P->ctx, P->params, "ddz").f; + if (!pj_param(P->ctx, P->params, "tdz").i) + { + proj_log_error (P, _("molodensky: missing dz")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } + Q->dz = pj_param(P->ctx, P->params, "ddz").f; - if (pj_param(P->ctx, P->params, "tda").i) { - count_required_params ++; - Q->da = pj_param(P->ctx, P->params, "dda").f; + if (!pj_param(P->ctx, P->params, "tda").i) + { + proj_log_error (P, _("molodensky: missing da")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } + Q->da = pj_param(P->ctx, P->params, "dda").f; - if (pj_param(P->ctx, P->params, "tdf").i) { - count_required_params ++; - Q->df = pj_param(P->ctx, P->params, "ddf").f; + if (!pj_param(P->ctx, P->params, "tdf").i) + { + proj_log_error (P, _("molodensky: missing df")); + return pj_default_destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } + Q->df = pj_param(P->ctx, P->params, "ddf").f; Q->abridged = pj_param(P->ctx, P->params, "tabridged").i; - /* We want all parameters (except +abridged) to be set */ - if (count_required_params == 0) - return pj_default_destructor(P, PJD_ERR_NO_ARGS); - - if (count_required_params != 5) - return pj_default_destructor(P, PJD_ERR_MISSING_ARGS); - return P; } diff --git a/src/transformations/tinshift.cpp b/src/transformations/tinshift.cpp index 96e0ea4f..8b73c28c 100644 --- a/src/transformations/tinshift.cpp +++ b/src/transformations/tinshift.cpp @@ -86,14 +86,14 @@ PJ *TRANSFORMATION(tinshift, 1) { const char *filename = pj_param(P->ctx, P->params, "sfile").s; if (!filename) { - proj_log_error(P, "tinshift: +file= should be specified."); - return destructor(P, PJD_ERR_NO_ARGS); + proj_log_error(P, _("tinshift: +file= should be specified.")); + return destructor(P, PROJ_ERR_INVALID_OP_MISSING_ARG); } auto file = NS_PROJ::FileManager::open_resource_file(P->ctx, filename); if (nullptr == file) { - proj_log_error(P, "tinshift: Cannot open %s", filename); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("tinshift: Cannot open %s"), filename); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } file->seek(0, SEEK_END); unsigned long long size = file->tell(); @@ -101,15 +101,15 @@ PJ *TRANSFORMATION(tinshift, 1) { // that could be a denial of service risk. 10 MB should be sufficiently // large for any valid use ! if (size > 10 * 1024 * 1024) { - proj_log_error(P, "tinshift: File %s too large", filename); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("tinshift: File %s too large"), filename); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } file->seek(0); std::string jsonStr; jsonStr.resize(static_cast<size_t>(size)); if (file->read(&jsonStr[0], jsonStr.size()) != jsonStr.size()) { - proj_log_error(P, "tinshift: Cannot read %s", filename); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("tinshift: Cannot read %s"), filename); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } auto Q = new tinshiftData(); @@ -119,8 +119,8 @@ PJ *TRANSFORMATION(tinshift, 1) { try { Q->evaluator.reset(new Evaluator(TINShiftFile::parse(jsonStr))); } catch (const std::exception &e) { - proj_log_error(P, "tinshift: invalid model: %s", e.what()); - return destructor(P, PJD_ERR_INVALID_ARG); + proj_log_error(P, _("tinshift: invalid model: %s"), e.what()); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } P->destructor = destructor; diff --git a/src/transformations/vgridshift.cpp b/src/transformations/vgridshift.cpp index 3d9f046a..b85e4ba4 100644 --- a/src/transformations/vgridshift.cpp +++ b/src/transformations/vgridshift.cpp @@ -179,8 +179,8 @@ PJ *TRANSFORMATION(vgridshift,0) { P->reassign_context = reassign_context; if (!pj_param(P->ctx, P->params, "tgrids").i) { - proj_log_error(P, "vgridshift: +grids parameter missing."); - return destructor(P, PJD_ERR_NO_ARGS); + proj_log_error(P, _("hgridshift: +grids parameter missing.")); + return destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } /* TODO: Refactor into shared function that can be used */ @@ -227,8 +227,8 @@ PJ *TRANSFORMATION(vgridshift,0) { /* Was gridlist compiled properly? */ if ( proj_errno(P) ) { - proj_log_error(P, "vgridshift: could not find required grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_log_error(P, _("vgridshift: could not find required grid(s).")); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } gMutex.lock(); diff --git a/src/transformations/xyzgridshift.cpp b/src/transformations/xyzgridshift.cpp index e37e874d..d00d6484 100644 --- a/src/transformations/xyzgridshift.cpp +++ b/src/transformations/xyzgridshift.cpp @@ -257,7 +257,7 @@ PJ *TRANSFORMATION(xyzgridshift,0) { // Pass a dummy ellipsoid definition that will be overridden just afterwards Q->cart = proj_create(P->ctx, "+proj=cart +a=1"); if (Q->cart == nullptr) - return destructor(P, ENOMEM); + return destructor(P, PROJ_ERR_INVALID_OP /*ENOMEM*/); /* inherit ellipsoid definition from P to Q->cart */ pj_inherit_ellipsoid_def (P, Q->cart); @@ -272,14 +272,14 @@ PJ *TRANSFORMATION(xyzgridshift,0) { // in RGF93 Q->grid_ref_is_input = false; } else { - proj_log_error(P, "xyzgridshift: unusupported value for grid_ref"); - return destructor (P, PJD_ERR_NO_ARGS); + proj_log_error(P, _("xyzgridshift: unusupported value for grid_ref")); + return destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); } } if (0==pj_param(P->ctx, P->params, "tgrids").i) { - proj_log_error(P, "xyzgridshift: +grids parameter missing."); - return destructor (P, PJD_ERR_NO_ARGS); + proj_log_error(P, _("xyzgridshift: +grids parameter missing.")); + return destructor (P, PROJ_ERR_INVALID_OP_MISSING_ARG); } /* multiplier for delta x,y,z */ @@ -294,8 +294,8 @@ PJ *TRANSFORMATION(xyzgridshift,0) { Q->grids = pj_generic_grid_init(P, "grids"); /* Was gridlist compiled properly? */ if ( proj_errno(P) ) { - proj_log_error(P, "xyzgridshift: could not find required grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + proj_log_error(P, _("xyzgridshift: could not find required grid(s).")); + return destructor(P, PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID); } } |
