LCOV - code coverage report
Current view: top level - apps - commonutils.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 48 53 90.6 %
Date: 2025-01-18 12:42:00 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL Utilities
       4             :  * Purpose:  Common utility routines
       5             :  * Author:   Even Rouault, <even dot rouault at spatialys.com>
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2011-2012, Even Rouault <even dot rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #include "commonutils.h"
      14             : 
      15             : #include <cstdio>
      16             : #include <cstring>
      17             : 
      18             : #include <string>
      19             : 
      20             : #include "cpl_conv.h"
      21             : #include "cpl_string.h"
      22             : #include "gdal.h"
      23             : 
      24             : /* -------------------------------------------------------------------- */
      25             : /*                         GetOutputDriversFor()                        */
      26             : /* -------------------------------------------------------------------- */
      27             : 
      28         373 : std::vector<std::string> GetOutputDriversFor(const char *pszDestFilename,
      29             :                                              int nFlagRasterVector)
      30             : {
      31         746 :     return CPLStringList(GDALGetOutputDriversForDatasetName(
      32             :         pszDestFilename, nFlagRasterVector, /* bSingleMatch = */ false,
      33         746 :         /* bEmitWarning = */ false));
      34             : }
      35             : 
      36             : /* -------------------------------------------------------------------- */
      37             : /*                      GetOutputDriverForRaster()                      */
      38             : /* -------------------------------------------------------------------- */
      39             : 
      40        1890 : CPLString GetOutputDriverForRaster(const char *pszDestFilename)
      41             : {
      42             :     const CPLStringList aosList(GDALGetOutputDriversForDatasetName(
      43             :         pszDestFilename, GDAL_OF_RASTER, /* bSingleMatch = */ true,
      44        3780 :         /* bEmitWarning = */ true));
      45        1890 :     if (!aosList.empty())
      46             :     {
      47        1890 :         CPLDebug("GDAL", "Using %s driver", aosList[0]);
      48        1890 :         return aosList[0];
      49             :     }
      50           0 :     return CPLString();
      51             : }
      52             : 
      53             : /* -------------------------------------------------------------------- */
      54             : /*                        EarlySetConfigOptions()                       */
      55             : /* -------------------------------------------------------------------- */
      56             : 
      57         968 : void EarlySetConfigOptions(int argc, char **argv)
      58             : {
      59             :     // Must process some config options before GDALAllRegister() or
      60             :     // OGRRegisterAll(), but we can't call GDALGeneralCmdLineProcessor() or
      61             :     // OGRGeneralCmdLineProcessor(), because it needs the drivers to be
      62             :     // registered for the --format or --formats options.
      63             : 
      64             :     // Start with --debug, so that "my_command --config UNKNOWN_CONFIG_OPTION --debug on"
      65             :     // detects and warns about a unknown config option.
      66        6174 :     for (int i = 1; i < argc; i++)
      67             :     {
      68        5207 :         if (EQUAL(argv[i], "--config") && i + 1 < argc)
      69             :         {
      70          34 :             const char *pszArg = argv[i + 1];
      71          34 :             if (strchr(pszArg, '=') != nullptr)
      72             :             {
      73           2 :                 char *pszKey = nullptr;
      74           2 :                 const char *pszValue = CPLParseNameValue(pszArg, &pszKey);
      75           2 :                 if (pszKey && EQUAL(pszKey, "CPL_DEBUG") && pszValue)
      76             :                 {
      77           0 :                     CPLSetConfigOption(pszKey, pszValue);
      78             :                 }
      79           2 :                 CPLFree(pszKey);
      80           2 :                 ++i;
      81             :             }
      82             :             else
      83             :             {
      84          32 :                 if (i + 2 >= argc)
      85             :                 {
      86           1 :                     CPLError(CE_Failure, CPLE_AppDefined,
      87             :                              "--config option given without a key and value "
      88             :                              "argument.");
      89           1 :                     return;
      90             :                 }
      91             : 
      92          31 :                 if (EQUAL(argv[i + 1], "CPL_DEBUG"))
      93             :                 {
      94           0 :                     CPLSetConfigOption(argv[i + 1], argv[i + 2]);
      95             :                 }
      96             : 
      97          31 :                 i += 2;
      98          33 :             }
      99             :         }
     100        5173 :         else if (EQUAL(argv[i], "--debug") && i + 1 < argc)
     101             :         {
     102           7 :             CPLSetConfigOption("CPL_DEBUG", argv[i + 1]);
     103           7 :             i += 1;
     104             :         }
     105             :     }
     106        6180 :     for (int i = 1; i < argc; i++)
     107             :     {
     108        5213 :         if (EQUAL(argv[i], "--config") && i + 1 < argc)
     109             :         {
     110          33 :             const char *pszArg = argv[i + 1];
     111          33 :             if (strchr(pszArg, '=') != nullptr)
     112             :             {
     113           2 :                 char *pszKey = nullptr;
     114           2 :                 const char *pszValue = CPLParseNameValue(pszArg, &pszKey);
     115           2 :                 if (pszKey && !EQUAL(pszKey, "CPL_DEBUG") && pszValue)
     116             :                 {
     117           2 :                     CPLSetConfigOption(pszKey, pszValue);
     118             :                 }
     119           2 :                 CPLFree(pszKey);
     120           2 :                 ++i;
     121             :             }
     122             :             else
     123             :             {
     124          31 :                 if (i + 2 >= argc)
     125             :                 {
     126           0 :                     CPLError(CE_Failure, CPLE_AppDefined,
     127             :                              "--config option given without a key and value "
     128             :                              "argument.");
     129           0 :                     return;
     130             :                 }
     131             : 
     132          31 :                 if (!EQUAL(argv[i + 1], "CPL_DEBUG"))
     133             :                 {
     134          31 :                     CPLSetConfigOption(argv[i + 1], argv[i + 2]);
     135             :                 }
     136             : 
     137          31 :                 i += 2;
     138             :             }
     139             :         }
     140             :     }
     141             : }
     142             : 
     143             : /************************************************************************/
     144             : /*                          GDALRemoveBOM()                             */
     145             : /************************************************************************/
     146             : 
     147             : /* Remove potential UTF-8 BOM from data (must be NUL terminated) */
     148           6 : void GDALRemoveBOM(GByte *pabyData)
     149             : {
     150           6 :     if (pabyData[0] == 0xEF && pabyData[1] == 0xBB && pabyData[2] == 0xBF)
     151             :     {
     152           1 :         memmove(pabyData, pabyData + 3,
     153           1 :                 strlen(reinterpret_cast<char *>(pabyData) + 3) + 1);
     154             :     }
     155           6 : }
     156             : 
     157             : /************************************************************************/
     158             : /*                            ArgIsNumeric()                            */
     159             : /************************************************************************/
     160             : 
     161         215 : int ArgIsNumeric(const char *pszArg)
     162             : 
     163             : {
     164         215 :     return CPLGetValueType(pszArg) != CPL_VALUE_STRING;
     165             : }

Generated by: LCOV version 1.14