From b65cc5d50414212efa0029e7715c92e880967a4f Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 27 Sep 2018 19:15:13 +0200 Subject: cs2cs_emulation_setup: fix issue with non C-locale in +towgs84 case, we use sprintf() with floating-point formatter to output the ellipsoid parameters. For a locale with decimal separtor != dot, the resulting string will not be parsed correctly by proj_atof(), leading to wrong numeric result. The fix is similar to the one done in pj_latlong_from_proj() Note for later: if using C++, we could use a locale-independent formatting solution to avoid such issue. --- src/pj_utils.c | 2 ++ src/proj_4D_api.c | 11 +++++++++++ 2 files changed, 13 insertions(+) (limited to 'src') diff --git a/src/pj_utils.c b/src/pj_utils.c index 3f18cc7e..81a80b45 100644 --- a/src/pj_utils.c +++ b/src/pj_utils.c @@ -105,6 +105,8 @@ PJ *pj_latlong_from_proj( PJ *pj_in ) { char* ptr = defn+strlen(defn); sprintf( ptr, " +es=%.16g", pj_in->es ); + /* TODO later: use C++ ostringstream with imbue(std::locale::classic()) */ + /* to be locale unaware */ for(; *ptr; ptr++) { if( *ptr == ',' ) diff --git a/src/proj_4D_api.c b/src/proj_4D_api.c index 74cf45d6..81967a1d 100644 --- a/src/proj_4D_api.c +++ b/src/proj_4D_api.c @@ -519,6 +519,17 @@ Returns 1 on success, 0 on failure if (P->is_geocent || P->helmert || do_cart) { char def[150]; sprintf (def, "break_cs2cs_recursion proj=cart a=%40.20g es=%40.20g", P->a_orig, P->es_orig); + { + /* In case the current locale does not use dot but comma as decimal */ + /* separator, replace it with dot, so that proj_atof() behaves */ + /* correctly. */ + /* TODO later: use C++ ostringstream with imbue(std::locale::classic()) */ + /* to be locale unaware */ + char* next_pos; + for (next_pos = def; (next_pos = strchr (next_pos, ',')) != NULL; next_pos++) { + *next_pos = '.'; + } + } Q = proj_create (P->ctx, def); if (0==Q) return 0; -- cgit v1.2.3