LCOV - code coverage report
Current view: top level - ogr - ogr_p.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 31 31 100.0 %
Date: 2024-11-21 22:18:42 Functions: 8 8 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * $Id$
       3             :  *
       4             :  * Project:  OpenGIS Simple Features Reference Implementation
       5             :  * Purpose:  Some private helper functions and stuff for OGR implementation.
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 1999, Frank Warmerdam
      10             :  * Copyright (c) 2008-2014, Even Rouault <even dot rouault at spatialys.com>
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef OGR_P_H_INCLUDED
      16             : #define OGR_P_H_INCLUDED
      17             : 
      18             : /* -------------------------------------------------------------------- */
      19             : /*      Include the common portability library ... lets us do lots      */
      20             : /*      of stuff easily.                                                */
      21             : /* -------------------------------------------------------------------- */
      22             : 
      23             : #include "cpl_string.h"
      24             : #include "cpl_conv.h"
      25             : #include "cpl_minixml.h"
      26             : 
      27             : #include "ogr_core.h"
      28             : 
      29             : #include <limits>
      30             : 
      31             : class OGRGeometry;
      32             : class OGRFieldDefn;
      33             : 
      34             : /* A default name for the default geometry column, instead of '' */
      35             : #define OGR_GEOMETRY_DEFAULT_NON_EMPTY_NAME "_ogr_geometry_"
      36             : 
      37             : #ifdef CPL_MSB
      38             : #define OGR_SWAP(x) (x == wkbNDR)
      39             : #else
      40             : #define OGR_SWAP(x) (x == wkbXDR)
      41             : #endif
      42             : 
      43             : /* PostGIS 1.X has non standard codes for the following geometry types */
      44             : #define POSTGIS15_CURVEPOLYGON 13 /* instead of 10 */
      45             : #define POSTGIS15_MULTICURVE 14   /* instead of 11 */
      46             : #define POSTGIS15_MULTISURFACE 15 /* instead of 12 */
      47             : 
      48             : /* Has been deprecated. Can only be used in very specific circumstances */
      49             : #ifdef GDAL_COMPILATION
      50             : #define wkb25DBitInternalUse 0x80000000
      51             : #endif
      52             : 
      53             : /* -------------------------------------------------------------------- */
      54             : /*      helper function for parsing well known text format vector objects.*/
      55             : /* -------------------------------------------------------------------- */
      56             : 
      57             : #ifdef OGR_GEOMETRY_H_INCLUDED
      58             : #define OGR_WKT_TOKEN_MAX 64
      59             : 
      60             : const char CPL_DLL *OGRWktReadToken(const char *pszInput, char *pszToken);
      61             : 
      62             : const char CPL_DLL *OGRWktReadPoints(const char *pszInput,
      63             :                                      OGRRawPoint **ppaoPoints, double **ppadfZ,
      64             :                                      int *pnMaxPoints, int *pnReadPoints);
      65             : 
      66             : const char CPL_DLL *
      67             : OGRWktReadPointsM(const char *pszInput, OGRRawPoint **ppaoPoints,
      68             :                   double **ppadfZ, double **ppadfM,
      69             :                   int *flags, /* geometry flags, are we expecting Z, M, or both;
      70             :                                  may change due to input */
      71             :                   int *pnMaxPoints, int *pnReadPoints);
      72             : 
      73             : void CPL_DLL OGRMakeWktCoordinate(char *, double, double, double, int);
      74             : std::string CPL_DLL OGRMakeWktCoordinate(double, double, double, int,
      75             :                                          const OGRWktOptions &opts);
      76             : void CPL_DLL OGRMakeWktCoordinateM(char *, double, double, double, double,
      77             :                                    OGRBoolean, OGRBoolean);
      78             : std::string CPL_DLL OGRMakeWktCoordinateM(double, double, double, double,
      79             :                                           OGRBoolean, OGRBoolean,
      80             :                                           const OGRWktOptions &opts);
      81             : 
      82             : #endif
      83             : 
      84             : void CPL_DLL OGRFormatDouble(char *pszBuffer, int nBufferLen, double dfVal,
      85             :                              char chDecimalSep, int nPrecision = 15,
      86             :                              char chConversionSpecifier = 'f');
      87             : 
      88             : #ifdef OGR_GEOMETRY_H_INCLUDED
      89             : std::string CPL_DLL OGRFormatDouble(double val, const OGRWktOptions &opts,
      90             :                                     int nDimIdx);
      91             : #endif
      92             : 
      93             : int OGRFormatFloat(char *pszBuffer, int nBufferLen, float fVal, int nPrecision,
      94             :                    char chConversionSpecifier);
      95             : 
      96             : /* -------------------------------------------------------------------- */
      97             : /*      Date-time parsing and processing functions                      */
      98             : /* -------------------------------------------------------------------- */
      99             : 
     100             : /* Internal use by OGR drivers only, CPL_DLL is just there in case */
     101             : /* they are compiled as plugins  */
     102             : 
     103             : int CPL_DLL OGRTimezoneToTZFlag(const char *pszTZ,
     104             :                                 bool bEmitErrorIfUnhandledFormat);
     105             : std::string CPL_DLL OGRTZFlagToTimezone(int nTZFlag,
     106             :                                         const char *pszUTCRepresentation);
     107             : 
     108             : int CPL_DLL OGRGetDayOfWeek(int day, int month, int year);
     109             : int CPL_DLL OGRParseXMLDateTime(const char *pszXMLDateTime, OGRField *psField);
     110             : int CPL_DLL OGRParseRFC822DateTime(const char *pszRFC822DateTime,
     111             :                                    OGRField *psField);
     112             : char CPL_DLL *OGRGetRFC822DateTime(const OGRField *psField);
     113             : char CPL_DLL *OGRGetXMLDateTime(const OGRField *psField);
     114             : char CPL_DLL *OGRGetXMLDateTime(const OGRField *psField,
     115             :                                 bool bAlwaysMillisecond);
     116             : // 30 = strlen("YYYY-MM-DDThh:mm:ss.sss+hh:mm") + 1
     117             : #define OGR_SIZEOF_ISO8601_DATETIME_BUFFER 30
     118             : int CPL_DLL
     119             : OGRGetISO8601DateTime(const OGRField *psField, bool bAlwaysMillisecond,
     120             :                       char szBuffer[OGR_SIZEOF_ISO8601_DATETIME_BUFFER]);
     121             : 
     122             : /** Precision of formatting */
     123             : enum class OGRISO8601Precision
     124             : {
     125             :     /** Automated mode: millisecond included if non zero, otherwise truncated at second */
     126             :     AUTO,
     127             :     /** Always include millisecond */
     128             :     MILLISECOND,
     129             :     /** Always include second, but no millisecond */
     130             :     SECOND,
     131             :     /** Always include minute, but no second */
     132             :     MINUTE
     133             : };
     134             : 
     135             : /** Configuration of the ISO8601 formatting output */
     136             : struct OGRISO8601Format
     137             : {
     138             :     /** Precision of formatting */
     139             :     OGRISO8601Precision ePrecision;
     140             : };
     141             : 
     142             : int CPL_DLL
     143             : OGRGetISO8601DateTime(const OGRField *psField, const OGRISO8601Format &sFormat,
     144             :                       char szBuffer[OGR_SIZEOF_ISO8601_DATETIME_BUFFER]);
     145             : char CPL_DLL *OGRGetXML_UTF8_EscapedString(const char *pszString);
     146             : bool CPL_DLL OGRParseDateTimeYYYYMMDDTHHMMZ(const char *pszInput, size_t nLen,
     147             :                                             OGRField *psField);
     148             : bool CPL_DLL OGRParseDateTimeYYYYMMDDTHHMMSSZ(const char *pszInput, size_t nLen,
     149             :                                               OGRField *psField);
     150             : bool CPL_DLL OGRParseDateTimeYYYYMMDDTHHMMSSsssZ(const char *pszInput,
     151             :                                                  size_t nLen,
     152             :                                                  OGRField *psField);
     153             : 
     154             : int OGRCompareDate(const OGRField *psFirstTuple,
     155             :                    const OGRField *psSecondTuple); /* used by ogr_gensql.cpp and
     156             :                                                       ogrfeaturequery.cpp */
     157             : 
     158             : /* General utility option processing. */
     159             : int CPL_DLL OGRGeneralCmdLineProcessor(int nArgc, char ***ppapszArgv,
     160             :                                        int nOptions);
     161             : 
     162             : /************************************************************************/
     163             : /*     Support for special attributes (feature query and selection)     */
     164             : /************************************************************************/
     165             : #define SPF_FID 0
     166             : #define SPF_OGR_GEOMETRY 1
     167             : #define SPF_OGR_STYLE 2
     168             : #define SPF_OGR_GEOM_WKT 3
     169             : #define SPF_OGR_GEOM_AREA 4
     170             : #define SPECIAL_FIELD_COUNT 5
     171             : 
     172             : extern const char *const SpecialFieldNames[SPECIAL_FIELD_COUNT];
     173             : 
     174             : /************************************************************************/
     175             : /*     Some SRS related stuff, search in SRS data files.                */
     176             : /************************************************************************/
     177             : 
     178             : OGRErr CPL_DLL OSRGetEllipsoidInfo(int, char **, double *, double *);
     179             : 
     180             : /* Fast atof function */
     181             : double OGRFastAtof(const char *pszStr);
     182             : 
     183             : OGRErr CPL_DLL OGRCheckPermutation(const int *panPermutation, int nSize);
     184             : 
     185             : /* GML related */
     186             : 
     187             : OGRGeometry CPL_DLL *GML2OGRGeometry_XMLNode(
     188             :     const CPLXMLNode *psNode, int nPseudoBoolGetSecondaryGeometryOption,
     189             :     int nRecLevel = 0, int nSRSDimension = 0, bool bIgnoreGSG = false,
     190             :     bool bOrientation = true, bool bFaceHoleNegative = false);
     191             : 
     192             : /************************************************************************/
     193             : /*                        PostGIS EWKB encoding                         */
     194             : /************************************************************************/
     195             : 
     196             : OGRGeometry CPL_DLL *OGRGeometryFromEWKB(GByte *pabyWKB, int nLength,
     197             :                                          int *pnSRID, int bIsPostGIS1_EWKB);
     198             : OGRGeometry CPL_DLL *OGRGeometryFromHexEWKB(const char *pszBytea, int *pnSRID,
     199             :                                             int bIsPostGIS1_EWKB);
     200             : char CPL_DLL *OGRGeometryToHexEWKB(OGRGeometry *poGeometry, int nSRSId,
     201             :                                    int nPostGISMajor, int nPostGISMinor);
     202             : 
     203             : /************************************************************************/
     204             : /*                        WKB Type Handling encoding                    */
     205             : /************************************************************************/
     206             : 
     207             : OGRErr CPL_DLL OGRReadWKBGeometryType(const unsigned char *pabyData,
     208             :                                       OGRwkbVariant wkbVariant,
     209             :                                       OGRwkbGeometryType *eGeometryType);
     210             : 
     211             : /************************************************************************/
     212             : /*                        WKT Type Handling encoding                    */
     213             : /************************************************************************/
     214             : 
     215             : OGRErr CPL_DLL OGRReadWKTGeometryType(const char *pszWKT,
     216             :                                       OGRwkbGeometryType *peGeometryType);
     217             : 
     218             : /************************************************************************/
     219             : /*                            Other                                     */
     220             : /************************************************************************/
     221             : 
     222             : void CPL_DLL OGRUpdateFieldType(OGRFieldDefn *poFDefn, OGRFieldType eNewType,
     223             :                                 OGRFieldSubType eNewSubType);
     224             : 
     225             : /************************************************************************/
     226             : /*                         OGRRoundValueIEEE754()                       */
     227             : /************************************************************************/
     228             : 
     229             : /** Set to zero least significants bits of a double precision floating-point
     230             :  * number (passed as an integer), taking into account a desired bit precision.
     231             :  *
     232             :  * @param nVal Integer representation of a IEEE754 double-precision number.
     233             :  * @param nBitsPrecision Desired precision (number of bits after integral part)
     234             :  * @return quantized nVal.
     235             :  * @since GDAL 3.9
     236             :  */
     237             : inline uint64_t OGRRoundValueIEEE754(uint64_t nVal,
     238             :                                      int nBitsPrecision) CPL_WARN_UNUSED_RESULT;
     239             : 
     240         104 : inline uint64_t OGRRoundValueIEEE754(uint64_t nVal, int nBitsPrecision)
     241             : {
     242         104 :     constexpr int MANTISSA_SIZE = std::numeric_limits<double>::digits - 1;
     243         104 :     constexpr int MAX_EXPONENT = std::numeric_limits<double>::max_exponent;
     244             : #if __cplusplus >= 201703L
     245             :     static_assert(MANTISSA_SIZE == 52);
     246             :     static_assert(MAX_EXPONENT == 1024);
     247             : #endif
     248             :     // Extract the binary exponent from the IEEE754 representation
     249         104 :     const int nExponent =
     250         104 :         ((nVal >> MANTISSA_SIZE) & (2 * MAX_EXPONENT - 1)) - (MAX_EXPONENT - 1);
     251             :     // Add 1 to round-up and the desired precision
     252         104 :     const int nBitsRequired = 1 + nExponent + nBitsPrecision;
     253             :     // Compute number of nullified bits
     254         104 :     int nNullifiedBits = MANTISSA_SIZE - nBitsRequired;
     255             :     // this will also capture NaN and Inf since nExponent = 1023,
     256             :     // and thus nNullifiedBits < 0
     257         104 :     if (nNullifiedBits <= 0)
     258           2 :         return nVal;
     259         102 :     if (nNullifiedBits >= MANTISSA_SIZE)
     260           2 :         nNullifiedBits = MANTISSA_SIZE;
     261         102 :     nVal >>= nNullifiedBits;
     262         102 :     nVal <<= nNullifiedBits;
     263         102 :     return nVal;
     264             : }
     265             : 
     266             : /************************************************************************/
     267             : /*                   OGRRoundCoordinatesIEEE754XYValues()               */
     268             : /************************************************************************/
     269             : 
     270             : /** Quantize XY values.
     271             :  *
     272             :  * @since GDAL 3.9
     273             :  */
     274             : template <int SPACING>
     275      665025 : inline void OGRRoundCoordinatesIEEE754XYValues(int nBitsPrecision,
     276             :                                                GByte *pabyBase, size_t nPoints)
     277             : {
     278             :     // Note: we use SPACING as template for improved code generation.
     279             : 
     280      665025 :     if (nBitsPrecision != INT_MIN)
     281             :     {
     282          42 :         for (size_t i = 0; i < nPoints; i++)
     283             :         {
     284             :             uint64_t nVal;
     285             : 
     286          29 :             memcpy(&nVal, pabyBase + SPACING * i, sizeof(uint64_t));
     287          29 :             nVal = OGRRoundValueIEEE754(nVal, nBitsPrecision);
     288          29 :             memcpy(pabyBase + SPACING * i, &nVal, sizeof(uint64_t));
     289             : 
     290          29 :             memcpy(&nVal, pabyBase + sizeof(uint64_t) + SPACING * i,
     291             :                    sizeof(uint64_t));
     292          29 :             nVal = OGRRoundValueIEEE754(nVal, nBitsPrecision);
     293          29 :             memcpy(pabyBase + sizeof(uint64_t) + SPACING * i, &nVal,
     294             :                    sizeof(uint64_t));
     295             :         }
     296             :     }
     297      665025 : }
     298             : 
     299             : /************************************************************************/
     300             : /*                     OGRRoundCoordinatesIEEE754()                     */
     301             : /************************************************************************/
     302             : 
     303             : /** Quantize Z or M values.
     304             :  *
     305             :  * @since GDAL 3.9
     306             :  */
     307             : template <int SPACING>
     308      215026 : inline void OGRRoundCoordinatesIEEE754(int nBitsPrecision, GByte *pabyBase,
     309             :                                        size_t nPoints)
     310             : {
     311      215026 :     if (nBitsPrecision != INT_MIN)
     312             :     {
     313          52 :         for (size_t i = 0; i < nPoints; i++)
     314             :         {
     315             :             uint64_t nVal;
     316             : 
     317          34 :             memcpy(&nVal, pabyBase + SPACING * i, sizeof(uint64_t));
     318          34 :             nVal = OGRRoundValueIEEE754(nVal, nBitsPrecision);
     319          34 :             memcpy(pabyBase + SPACING * i, &nVal, sizeof(uint64_t));
     320             :         }
     321             :     }
     322      215026 : }
     323             : 
     324             : /* -------------------------------------------------------------------- */
     325             : /*      helper functions for string escaping.                           */
     326             : /* -------------------------------------------------------------------- */
     327             : 
     328             : /** Replace all occurrences of ch by it repeated twice.
     329             :  * Typically used for SQL string literal or identifier escaping.
     330             :  */
     331             : std::string CPL_DLL OGRDuplicateCharacter(const std::string &osStr, char ch);
     332             : 
     333             : #endif /* ndef OGR_P_H_INCLUDED */

Generated by: LCOV version 1.14