From 05a1fd773c8f418ee9765465fc4863c1d6472a4c Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 5 Jan 2018 18:08:49 +0000 Subject: [PATCH] =?UTF-8?q?Add=20support=20for=20json-c=20v0.13=20(patch?= =?UTF-8?q?=20by=20Bj=C3=B6rn=20Esser,=20fixes=20=E2=80=8Bhttps://github.c?= =?UTF-8?q?om/OSGeo/gdal/pull/277,=20backport=20of=20r41043,=20fixes=20#71?= =?UTF-8?q?95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.osgeo.org/gdal/branches/2.2@41200 f0d54148-0727-0410-94bb-9a71ac55c965 --- gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp | 30 +++++++++++++++++------ 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp b/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp index fdf4b77b459..f8937885c76 100644 --- a/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp +++ b/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp @@ -27,12 +27,18 @@ * DEALINGS IN THE SOFTWARE. ****************************************************************************/ +#define JSON_C_VER_013 (13 << 8) + #include "ogrgeojsonwriter.h" #include "ogrgeojsonutils.h" #include "ogr_geojson.h" #include "ogrgeojsonreader.h" #include // JSON-C + +#if (!defined(JSON_C_VERSION_NUM)) || (JSON_C_VERSION_NUM < JSON_C_VER_013) #include +#endif + #include #include #include @@ -1381,13 +1387,17 @@ static int OGR_json_double_with_precision_to_string( struct json_object *jso, { // TODO(schwehr): Explain this casting. const int nPrecision = +#if (!defined(JSON_C_VERSION_NUM)) || (JSON_C_VERSION_NUM < JSON_C_VER_013) static_cast(reinterpret_cast(jso->_userdata)); +#else + static_cast(reinterpret_cast(json_object_get_userdata(jso))); +#endif char szBuffer[75] = {}; - OGRFormatDouble( szBuffer, sizeof(szBuffer), jso->o.c_double, '.', + OGRFormatDouble( szBuffer, sizeof(szBuffer), json_object_get_double(jso), '.', (nPrecision < 0) ? 15 : nPrecision ); if( szBuffer[0] == 't' /*oobig */ ) { - CPLsnprintf(szBuffer, sizeof(szBuffer), "%.18g", jso->o.c_double); + CPLsnprintf(szBuffer, sizeof(szBuffer), "%.18g", json_object_get_double(jso)); } return printbuf_memappend(pb, szBuffer, static_cast(strlen(szBuffer))); } @@ -1417,11 +1427,11 @@ OGR_json_double_with_significant_figures_to_string( struct json_object *jso, { char szBuffer[75] = {}; int nSize = 0; - if( CPLIsNan(jso->o.c_double)) + if( CPLIsNan(json_object_get_double(jso))) nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), "NaN"); - else if( CPLIsInf(jso->o.c_double) ) + else if( CPLIsInf(json_object_get_double(jso)) ) { - if( jso->o.c_double > 0 ) + if( json_object_get_double(jso) > 0 ) nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), "Infinity"); else nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), "-Infinity"); @@ -1429,13 +1439,17 @@ OGR_json_double_with_significant_figures_to_string( struct json_object *jso, else { char szFormatting[32] = {}; +#if (!defined(JSON_C_VERSION_NUM)) || (JSON_C_VERSION_NUM < JSON_C_VER_013) const int nSignificantFigures = (int) (GUIntptr_t) jso->_userdata; +#else + const int nSignificantFigures = (int) (GUIntptr_t) json_object_get_userdata(jso); +#endif const int nInitialSignificantFigures = nSignificantFigures >= 0 ? nSignificantFigures : 17; CPLsnprintf(szFormatting, sizeof(szFormatting), "%%.%dg", nInitialSignificantFigures); nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), - szFormatting, jso->o.c_double); + szFormatting, json_object_get_double(jso)); const char* pszDot = NULL; if( nSize+2 < static_cast(sizeof(szBuffer)) && (pszDot = strchr(szBuffer, '.')) == NULL ) @@ -1457,7 +1471,7 @@ OGR_json_double_with_significant_figures_to_string( struct json_object *jso, CPLsnprintf(szFormatting, sizeof(szFormatting), "%%.%dg", nInitialSignificantFigures- i); nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), - szFormatting, jso->o.c_double); + szFormatting, json_object_get_double(jso)); pszDot = strchr(szBuffer, '.'); if( pszDot != NULL && strstr(pszDot, "999999") == NULL && @@ -1472,7 +1486,7 @@ OGR_json_double_with_significant_figures_to_string( struct json_object *jso, CPLsnprintf(szFormatting, sizeof(szFormatting), "%%.%dg", nInitialSignificantFigures); nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), - szFormatting, jso->o.c_double); + szFormatting, json_object_get_double(jso)); if( nSize+2 < static_cast(sizeof(szBuffer)) && strchr(szBuffer, '.') == NULL ) {